blob: 8d6741af8bb691708876e494edc09f48e842c667 [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001###########################################################
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
Ying Wang1a081002010-07-13 14:55:47 -07008my_ndk_version_root :=
Ying Wang54fdb472012-08-14 10:13:16 -07009ifdef LOCAL_SDK_VERSION
Ying Wang1a081002010-07-13 14:55:47 -070010 ifdef LOCAL_IS_HOST_MODULE
Ying Wang54fdb472012-08-14 10:13:16 -070011 $(error $(LOCAL_PATH): LOCAL_SDK_VERSION can not be used in host module)
Ying Wang1a081002010-07-13 14:55:47 -070012 endif
13 ifneq ($(filter-out SHARED_LIBRARIES STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
Ying Wang54fdb472012-08-14 10:13:16 -070014 $(error $(LOCAL_PATH): NDK can only be used to build target shared/static libraries, \
Ying Wang1a081002010-07-13 14:55:47 -070015 while your module is of class $(LOCAL_MODULE_CLASS))
16 endif
Ying Wang54fdb472012-08-14 10:13:16 -070017 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)
Ying Wangcce4c972011-03-03 18:53:53 -080019
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))))
Ying Wang54fdb472012-08-14 10:13:16 -070030 $(error $(LOCAL_PATH): Unknown LOCAL_NDK_STL_VARIANT $(LOCAL_NDK_STL_VARIANT))
Ying Wangcce4c972011-03-03 18:53:53 -080031 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
Ying Wangd9020c22011-09-07 14:31:47 -070046 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
Ying Wang54fdb472012-08-14 10:13:16 -070048 my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/libgnustl_static.a
Ying Wangcce4c972011-03-03 18:53:53 -080049 endif
50 endif
Ying Wang1a081002010-07-13 14:55:47 -070051endif
52
Ying Wang704c0c92011-09-15 13:50:52 -070053##################################################
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
Ying Wang54fdb472012-08-14 10:13:16 -070096ifdef LOCAL_SDK_VERSION
Ying Wang704c0c92011-09-15 13:50:52 -070097 # 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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800110#######################################
111include $(BUILD_SYSTEM)/base_rules.mk
112#######################################
Evgeniy Stepanov6cc9c062012-03-30 12:15:12 +0400113
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
Stephen Hinesbec4a4b2012-06-26 16:38:21 -0700122# Add in libcompiler-rt for all regular device builds
Ying Wang54fdb472012-08-14 10:13:16 -0700123ifeq (,$(LOCAL_SDK_VERSION)$(LOCAL_IS_HOST_MODULE)$(BUILD_TINY_ANDROID))
Stephen Hinesc72f3962012-06-11 14:53:34 -0700124 LOCAL_STATIC_LIBRARIES += $(COMPILER_RT_CONFIG_EXTRA_STATIC_LIBRARIES)
125endif
126
Ying Wangdfbe79b2012-03-22 11:26:22 -0700127my_compiler_dependencies :=
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400128ifeq ($(strip $(LOCAL_CLANG)),true)
129 LOCAL_CFLAGS += $(CLANG_CONFIG_EXTRA_CFLAGS)
130 LOCAL_LDFLAGS += $(CLANG_CONFIG_EXTRA_LDFLAGS)
Ying Wangdfbe79b2012-03-22 11:26:22 -0700131 my_compiler_dependencies := $(CLANG) $(CLANG_CXX)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400132endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800133
Jing Yu2dcc8062009-09-21 16:31:50 -0700134####################################################
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
Kito Cheng70dc3e12012-06-15 15:15:50 +0800143####################################################
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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800152###########################################################
Jim Huang20d1ba62010-10-14 16:15:56 +0800153## Explicitly declare assembly-only __ASSEMBLY__ macro for
154## assembly source
155###########################################################
156LOCAL_ASFLAGS += -D__ASSEMBLY__
157
158###########################################################
Ying Wang1a081002010-07-13 14:55:47 -0700159## Define PRIVATE_ variables from global vars
160###########################################################
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400161ifeq ($(strip $(LOCAL_CLANG)),true)
162my_target_global_cflags := $(TARGET_GLOBAL_CLANG_FLAGS)
163else
164my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS)
165endif
166
Ying Wang54fdb472012-08-14 10:13:16 -0700167ifdef LOCAL_SDK_VERSION
Ying Wang1a081002010-07-13 14:55:47 -0700168my_target_project_includes :=
Evgeniy Stepanova7095e92012-03-30 12:18:52 +0400169my_target_c_includes := $(my_ndk_stl_include_path) $(my_ndk_version_root)/usr/include
Ying Wang1a081002010-07-13 14:55:47 -0700170# TODO: more reliable way to remove platform stuff.
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400171my_target_global_cflags := $(filter-out -include -I system/%, $(my_target_global_cflags))
Ying Wang1a081002010-07-13 14:55:47 -0700172my_target_global_cppflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CPPFLAGS))
173else
174my_target_project_includes := $(TARGET_PROJECT_INCLUDES)
Evgeniy Stepanova7095e92012-03-30 12:18:52 +0400175my_target_c_includes := $(TARGET_C_INCLUDES)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400176my_target_global_cflags := $(my_target_global_cflags)
Ying Wang1a081002010-07-13 14:55:47 -0700177my_target_global_cppflags := $(TARGET_GLOBAL_CPPFLAGS)
Evgeniy Stepanova7095e92012-03-30 12:18:52 +0400178ifeq ($(strip $(LOCAL_CLANG)),true)
179 my_target_c_includes += $(CLANG_CONFIG_EXTRA_TARGET_C_INCLUDES)
180endif
Ying Wang1a081002010-07-13 14:55:47 -0700181endif
182$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes)
Evgeniy Stepanova7095e92012-03-30 12:18:52 +0400183$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_includes)
Ying Wang1a081002010-07-13 14:55:47 -0700184$(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###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800188## Define PRIVATE_ variables used by multiple module types
189###########################################################
190$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700191 $(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800192
193ifeq ($(strip $(LOCAL_CC)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400194 ifeq ($(strip $(LOCAL_CLANG)),true)
195 LOCAL_CC := $(CLANG)
196 else
197 LOCAL_CC := $($(my_prefix)CC)
198 endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800199endif
200$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(LOCAL_CC)
201
202ifeq ($(strip $(LOCAL_CXX)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400203 ifeq ($(strip $(LOCAL_CLANG)),true)
204 LOCAL_CXX := $(CLANG_CXX)
205 else
206 LOCAL_CXX := $($(my_prefix)CXX)
207 endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800208endif
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
Ying Wangfcdabd42011-04-25 14:22:41 -0700226ifeq (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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800232###########################################################
233## Define arm-vs-thumb-mode flags.
234###########################################################
235LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
Chih-Wei Huang0d09e582010-07-09 10:07:52 +0800236ifeq ($(TARGET_ARCH),arm)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800237arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
238normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
239
Dave Bort95282482009-04-23 18:44:55 -0700240# 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).
Evgeniy Stepanovf50f4c52012-04-05 11:44:37 +0400243ifeq ($(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
Dave Bort95282482009-04-23 18:44:55 -0700247arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CFLAGS)
248normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CFLAGS)
Evgeniy Stepanovf50f4c52012-04-05 11:44:37 +0400249endif
250
Chih-Wei Huang0d09e582010-07-09 10:07:52 +0800251else
252arm_objects_mode :=
253normal_objects_mode :=
254arm_objects_cflags :=
255normal_objects_cflags :=
256endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800257
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###########################################################
Ying Wanga5fc87a2010-11-02 18:43:16 -0700280## 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)/, \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700289 $(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath)))
Ying Wanga5fc87a2010-11-02 18:43:16 -0700290proto_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)
Ying Wang33c0d952010-11-05 11:30:58 -0700294$(proto_generated_cc_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700295$(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
Ying Wang022a7b32012-06-13 11:38:10 -0700301$(proto_generated_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
302$(proto_generated_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
Narayan Kamath21094872012-04-02 18:19:31 +0100303$(proto_generated_objects): $(proto_generated_cc_sources_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc $(proto_generated_headers)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700304 $(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###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800318## YACC: Compile .y files to .cpp and the to .o.
319###########################################################
320
321yacc_sources := $(filter %.y,$(LOCAL_SRC_FILES))
322yacc_cpps := $(addprefix \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700323 $(intermediates)/,$(yacc_sources:.y=$(LOCAL_CPP_EXTENSION)))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800324yacc_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): \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700329 $(TOPDIR)$(LOCAL_PATH)/%.y \
330 $(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800331 $(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 \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700346 $(intermediates)/,$(lex_sources:.l=$(LOCAL_CPP_EXTENSION)))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800347lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o)
348
349ifneq ($(strip $(lex_cpps)),)
350$(lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700351 $(TOPDIR)$(LOCAL_PATH)/%.l
The Android Open Source Project88b60792009-03-03 19:28:42 -0800352 $(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: \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700357 $(intermediates)/%$(LOCAL_CPP_EXTENSION) \
358 $(LOCAL_ADDITIONAL_DEPENDENCIES) \
359 $(yacc_headers)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800360 $(transform-$(PRIVATE_HOST)cpp-to-o)
361endif
362
363###########################################################
364## C++: Compile .cpp files to .o.
365###########################################################
366
Jeff Browne33ba4c2011-07-11 22:11:46 -0700367# we also do this on host modules, even though
The Android Open Source Project88b60792009-03-03 19:28:42 -0800368# 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: \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700384 $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
385 $(yacc_cpps) $(proto_generated_headers) $(my_compiler_dependencies) \
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400386 $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800387 $(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)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400403$(gen_cpp_objects): $(intermediates)/%.o: \
404 $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700405 $(proto_generated_headers) $(my_compiler_dependencies) \
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400406 $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800407 $(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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400419$(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700420 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800421 $(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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400429$(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700430 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800431 $(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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400455$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700456 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800457 $(transform-$(PRIVATE_HOST)c-to-o)
458-include $(c_objects:%.o=%.P)
459endif
460
461###########################################################
Jack Paleviche7b3e2c2009-05-04 14:32:44 -0700462## 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)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400473$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700474 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
Jack Paleviche7b3e2c2009-05-04 14:32:44 -0700475 $(transform-$(PRIVATE_HOST)c-to-o)
476-include $(gen_c_objects:%.o=%.P)
477endif
478
479###########################################################
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +0200480## 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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400487$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700488 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +0200489 $(transform-$(PRIVATE_HOST)m-to-o)
490-include $(objc_objects:%.o=%.P)
491endif
492
493###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800494## 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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400501$(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700502 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800503 $(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)),)
Evgeniy Stepanovb71e2df2012-03-20 18:00:16 +0400511$(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700512 $(my_compiler_dependencies) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800513 $(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
Ying Wang5f074802011-11-08 09:31:21 -0800520####################################################
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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800540###########################################################
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 := \
Ying Wangdfbe79b2012-03-22 11:26:22 -0700547 $(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))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800558
Colin Cross9ad36ef2012-03-30 19:31:00 -0700559LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800560
Ying Wang54fdb472012-08-14 10:13:16 -0700561ifndef LOCAL_SDK_VERSION
Ying Wangbce4b752010-07-22 15:51:56 -0700562 LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
563endif
564
Ying Wang5f074802011-11-08 09:31:21 -0800565$(all_objects) : | $(LOCAL_GENERATED_SOURCES) $(import_includes)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800566ALL_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.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800575###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800576
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
Ying Wang54fdb472012-08-14 10:13:16 -0700606ifdef LOCAL_SDK_VERSION
The Android Open Source Project88b60792009-03-03 19:28:42 -0800607built_shared_libraries := \
608 $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
609 $(addsuffix $(so_suffix), \
610 $(LOCAL_SHARED_LIBRARIES)))
611
Ying Wangcce4c972011-03-03 18:53:53 -0800612my_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)))
Ying Wang1a081002010-07-13 14:55:47 -0700616
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)))
Ying Wang1a081002010-07-13 14:55:47 -0700625endif
626
The Android Open Source Project88b60792009-03-03 19:28:42 -0800627built_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
Ying Wang54fdb472012-08-14 10:13:16 -0700632ifdef LOCAL_SDK_VERSION
Ying Wangcce4c972011-03-03 18:53:53 -0800633built_static_libraries += $(my_ndk_stl_static_lib)
634endif
635
The Android Open Source Project88b60792009-03-03 19:28:42 -0800636built_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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800641# 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
Steve Blockd14d3b42012-03-01 11:34:41 +0000644# libraries that we use. (see notice_files.mk)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800645
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
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700650# Default is -fno-rtti.
Doug Kwane3c3c6d2011-06-07 10:55:48 -0700651ifeq ($(strip $(LOCAL_RTTI_FLAG)),)
652LOCAL_RTTI_FLAG := -fno-rtti
653endif
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700654
The Android Open Source Project88b60792009-03-03 19:28:42 -0800655###########################################################
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)
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700662$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800663$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
664$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
Ying Wang5f074802011-11-08 09:31:21 -0800665$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_IMPORT_INCLUDES := $(import_includes)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800666$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
667$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
Jeff Brown703e7c62011-02-04 20:15:00 -0800668$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_CRT := $(LOCAL_NO_CRT)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800669
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
The Android Open Source Project88b60792009-03-03 19:28:42 -0800686# 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)
Ying Wang5f074802011-11-08 09:31:21 -0800690
691###########################################################
692# Export includes
693###########################################################
694export_includes := $(intermediates)/export_includes
695$(export_includes): PRIVATE_EXPORT_C_INCLUDE_DIRS := $(LOCAL_EXPORT_C_INCLUDE_DIRS)
Ying Wang68f1c772012-04-23 21:29:18 -0700696$(export_includes) : $(LOCAL_MODULE_MAKEFILE)
Ying Wang5f074802011-11-08 09:31:21 -0800697 @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
Ying Wang616e5962012-04-18 17:35:55 -0700706
707# Make sure export_includes gets generated when you are running mm/mmm
708$(LOCAL_BUILT_MODULE) : | $(export_includes)