blob: 0374e9386fa18512c4ca785e7c6303dd70409dd3 [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 -07008######################################
9## Sanity check for LOCAL_NDK_VERSION
10######################################
11my_ndk_version_root :=
12ifdef LOCAL_NDK_VERSION
13 ifdef LOCAL_IS_HOST_MODULE
14 $(error $(LOCAL_PATH): LOCAL_NDK_VERSION can not be used in host module)
15 endif
16 ifneq ($(filter-out SHARED_LIBRARIES STATIC_LIBRARIES,$(LOCAL_MODULE_CLASS)),)
17 $(error $(LOCAL_PATH): LOCAL_NDK_VERSION can only be used to build target shared/static libraries, \
18 while your module is of class $(LOCAL_MODULE_CLASS))
19 endif
20 ifeq ($(filter $(LOCAL_NDK_VERSION),$(TARGET_AVAILABLE_NDK_VERSIONS)),)
21 $(error $(LOCAL_PATH): Invalid LOCAL_NDK_VERSION '$(LOCAL_NDK_VERSION)' \
22 Choices are $(TARGET_AVAILABLE_NDK_VERSIONS))
23 endif
24 ifndef LOCAL_SDK_VERSION
25 $(error $(LOCAL_PATH): LOCAL_NDK_VERSION must be defined with LOCAL_SDK_VERSION)
26 endif
Ying Wang2f76c6d2011-02-23 10:07:03 -080027 my_ndk_source_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/android-ndk-r$(LOCAL_NDK_VERSION)/sources
Ying Wang02c98132010-09-23 17:59:36 -070028 my_ndk_version_root := $(HISTORICAL_NDK_VERSIONS_ROOT)/android-ndk-r$(LOCAL_NDK_VERSION)/platforms/android-$(LOCAL_SDK_VERSION)/arch-$(TARGET_ARCH)
Ying Wang1a081002010-07-13 14:55:47 -070029 ifeq ($(wildcard $(my_ndk_version_root)),)
30 $(error $(LOCAL_PATH): ndk version root does not exist: $(my_ndk_version_root))
31 endif
Ying Wangcce4c972011-03-03 18:53:53 -080032
33 # Set up the NDK stl variant. Starting from NDK-r5 the c++ stl resides in a separate location.
34 # See ndk/docs/CPLUSPLUS-SUPPORT.html
35 my_ndk_stl_include_path :=
36 my_ndk_stl_shared_lib_fullpath :=
37 my_ndk_stl_shared_lib :=
38 my_ndk_stl_static_lib :=
39 ifeq (,$(LOCAL_NDK_STL_VARIANT))
40 LOCAL_NDK_STL_VARIANT := system
41 endif
42 ifneq (1,$(words $(filter system stlport_static stlport_shared gnustl_static, $(LOCAL_NDK_STL_VARIANT))))
43 $(error $(LOCAL_PATH): Unkown LOCAL_NDK_STL_VARIANT $(LOCAL_NDK_STL_VARIANT))
44 endif
45 ifeq (system,$(LOCAL_NDK_STL_VARIANT))
46 my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/system/include
47 # for "system" variant, the shared library exists in the system library and -lstdc++ is added by default.
48 else # LOCAL_NDK_STL_VARIANT is not system
49 ifneq (,$(filter stlport_%, $(LOCAL_NDK_STL_VARIANT)))
50 my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/stlport/stlport
51 ifeq (stlport_static,$(LOCAL_NDK_STL_VARIANT))
52 my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_CPU_ABI)/libstlport_static.a
53 else
54 my_ndk_stl_shared_lib_fullpath := $(my_ndk_source_root)/cxx-stl/stlport/libs/$(TARGET_CPU_ABI)/libstlport_shared.so
55 my_ndk_stl_shared_lib := -lstlport_shared
56 endif
57 else
58 # LOCAL_NDK_STL_VARIANT is gnustl_static
59 my_ndk_stl_include_path := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/include
60 my_ndk_stl_static_lib := $(my_ndk_source_root)/cxx-stl/gnu-libstdc++/libs/$(TARGET_CPU_ABI)/libstdc++.a
61 endif
62 endif
63
Ying Wang1a081002010-07-13 14:55:47 -070064endif
65
The Android Open Source Project88b60792009-03-03 19:28:42 -080066#######################################
67include $(BUILD_SYSTEM)/base_rules.mk
68#######################################
69
Jing Yu2dcc8062009-09-21 16:31:50 -070070####################################################
71## Add FDO flags if FDO is turned on and supported
72####################################################
73ifeq ($(strip $(LOCAL_NO_FDO_SUPPORT)),)
74 LOCAL_CFLAGS += $(TARGET_FDO_CFLAGS)
75 LOCAL_CPPFLAGS += $(TARGET_FDO_CFLAGS)
76 LOCAL_LDFLAGS += $(TARGET_FDO_CFLAGS)
77endif
78
The Android Open Source Project88b60792009-03-03 19:28:42 -080079###########################################################
Jim Huang20d1ba62010-10-14 16:15:56 +080080## Explicitly declare assembly-only __ASSEMBLY__ macro for
81## assembly source
82###########################################################
83LOCAL_ASFLAGS += -D__ASSEMBLY__
84
85###########################################################
Ying Wang1a081002010-07-13 14:55:47 -070086## Define PRIVATE_ variables from global vars
87###########################################################
88ifdef LOCAL_NDK_VERSION
89my_target_project_includes :=
Ying Wangcce4c972011-03-03 18:53:53 -080090my_target_c_inclues := $(my_ndk_stl_include_path) $(my_ndk_version_root)/usr/include
Ying Wang1a081002010-07-13 14:55:47 -070091# TODO: more reliable way to remove platform stuff.
92my_target_global_cflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CFLAGS))
93my_target_global_cppflags := $(filter-out -include -I system/%, $(TARGET_GLOBAL_CPPFLAGS))
94else
95my_target_project_includes := $(TARGET_PROJECT_INCLUDES)
96my_target_c_inclues := $(TARGET_C_INCLUDES)
97my_target_global_cflags := $(TARGET_GLOBAL_CFLAGS)
98my_target_global_cppflags := $(TARGET_GLOBAL_CPPFLAGS)
99endif
100$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_PROJECT_INCLUDES := $(my_target_project_includes)
101$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_C_INCLUDES := $(my_target_c_inclues)
102$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CFLAGS := $(my_target_global_cflags)
103$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_TARGET_GLOBAL_CPPFLAGS := $(my_target_global_cppflags)
104
105###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800106## Define PRIVATE_ variables used by multiple module types
107###########################################################
108$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
109 $(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
110
111ifeq ($(strip $(LOCAL_CC)),)
112 LOCAL_CC := $($(my_prefix)CC)
113endif
114$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(LOCAL_CC)
115
116ifeq ($(strip $(LOCAL_CXX)),)
117 LOCAL_CXX := $($(my_prefix)CXX)
118endif
119$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(LOCAL_CXX)
120
121# TODO: support a mix of standard extensions so that this isn't necessary
122LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))
123ifeq ($(LOCAL_CPP_EXTENSION),)
124 LOCAL_CPP_EXTENSION := .cpp
125endif
126$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPP_EXTENSION := $(LOCAL_CPP_EXTENSION)
127
128# Certain modules like libdl have to have symbols resolved at runtime and blow
129# up if --no-undefined is passed to the linker.
130ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),)
131ifeq ($(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)),)
132 LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) $($(my_prefix)NO_UNDEFINED_LDFLAGS)
133endif
134endif
135
Ying Wangfcdabd42011-04-25 14:22:41 -0700136ifeq (true,$(LOCAL_GROUP_STATIC_LIBRARIES))
137$(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES := true
138else
139$(LOCAL_BUILT_MODULE): PRIVATE_GROUP_STATIC_LIBRARIES :=
140endif
141
The Android Open Source Project88b60792009-03-03 19:28:42 -0800142###########################################################
143## Define arm-vs-thumb-mode flags.
144###########################################################
145LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
Chih-Wei Huang0d09e582010-07-09 10:07:52 +0800146ifeq ($(TARGET_ARCH),arm)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800147arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
148normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
149
Dave Bort95282482009-04-23 18:44:55 -0700150# Read the values from something like TARGET_arm_CFLAGS or
151# TARGET_thumb_CFLAGS. HOST_(arm|thumb)_CFLAGS values aren't
152# actually used (although they are usually empty).
153arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CFLAGS)
154normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CFLAGS)
Chih-Wei Huang0d09e582010-07-09 10:07:52 +0800155else
156arm_objects_mode :=
157normal_objects_mode :=
158arm_objects_cflags :=
159normal_objects_cflags :=
160endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800161
162###########################################################
163## Define per-module debugging flags. Users can turn on
164## debugging for a particular module by setting DEBUG_MODULE_ModuleName
165## to a non-empty value in their environment or buildspec.mk,
166## and setting HOST_/TARGET_CUSTOM_DEBUG_CFLAGS to the
167## debug flags that they want to use.
168###########################################################
169ifdef DEBUG_MODULE_$(strip $(LOCAL_MODULE))
170 debug_cflags := $($(my_prefix)CUSTOM_DEBUG_CFLAGS)
171else
172 debug_cflags :=
173endif
174
175###########################################################
176## Stuff source generated from one-off tools
177###########################################################
178$(LOCAL_GENERATED_SOURCES): PRIVATE_MODULE := $(LOCAL_MODULE)
179
180ALL_GENERATED_SOURCES += $(LOCAL_GENERATED_SOURCES)
181
182
183###########################################################
Ying Wanga5fc87a2010-11-02 18:43:16 -0700184## Compile the .proto files to .cc and then to .o
185###########################################################
186proto_sources := $(filter %.proto,$(LOCAL_SRC_FILES))
187proto_generated_objects :=
188proto_generated_headers :=
189ifneq ($(proto_sources),)
190proto_sources_fullpath := $(addprefix $(LOCAL_PATH)/, $(proto_sources))
191proto_generated_cc_sources_dir := $(intermediates)/proto
192proto_generated_cc_sources := $(addprefix $(proto_generated_cc_sources_dir)/, \
193 $(patsubst %.proto,%.pb.cc,$(proto_sources_fullpath)))
194proto_generated_objects := $(patsubst %.cc,%.o, $(proto_generated_cc_sources))
195
196$(proto_generated_cc_sources): PRIVATE_PROTO_INCLUDES := $(TOP)
197$(proto_generated_cc_sources): PRIVATE_PROTO_CC_OUTPUT_DIR := $(proto_generated_cc_sources_dir)
Ying Wang33c0d952010-11-05 11:30:58 -0700198$(proto_generated_cc_sources): PRIVATE_PROTOC_FLAGS := $(LOCAL_PROTOC_FLAGS)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700199$(proto_generated_cc_sources): $(proto_generated_cc_sources_dir)/%.pb.cc: %.proto $(PROTOC)
200 $(transform-proto-to-cc)
201
202proto_generated_headers := $(patsubst %.pb.cc,%.pb.h, $(proto_generated_cc_sources))
203$(proto_generated_headers): $(proto_generated_cc_sources_dir)/%.pb.h: $(proto_generated_cc_sources_dir)/%.pb.cc
204
205$(proto_generated_cc_sources): PRIVATE_ARM_MODE := $(normal_objects_mode)
206$(proto_generated_cc_sources): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
207$(proto_generated_objects): $(proto_generated_cc_sources_dir)/%.o: $(proto_generated_cc_sources_dir)/%.cc
208 $(transform-$(PRIVATE_HOST)cpp-to-o)
209-include $(proto_generated_objects:%.o=%.P)
210
211LOCAL_C_INCLUDES += external/protobuf/src $(proto_generated_cc_sources_dir)
212LOCAL_CFLAGS += -DGOOGLE_PROTOBUF_NO_RTTI
213ifeq ($(LOCAL_PROTOC_OPTIMIZE_TYPE),full)
214LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-full
215else
216LOCAL_STATIC_LIBRARIES += libprotobuf-cpp-2.3.0-lite
217endif
218endif
219
220
221###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800222## YACC: Compile .y files to .cpp and the to .o.
223###########################################################
224
225yacc_sources := $(filter %.y,$(LOCAL_SRC_FILES))
226yacc_cpps := $(addprefix \
227 $(intermediates)/,$(yacc_sources:.y=$(LOCAL_CPP_EXTENSION)))
228yacc_headers := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.h)
229yacc_objects := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.o)
230
231ifneq ($(strip $(yacc_cpps)),)
232$(yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
233 $(TOPDIR)$(LOCAL_PATH)/%.y \
Patrick Scottd033d572009-05-19 18:13:58 -0400234 $(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800235 $(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION))
236$(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
237
238$(yacc_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
239$(yacc_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
240$(yacc_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
241 $(transform-$(PRIVATE_HOST)cpp-to-o)
242endif
243
244###########################################################
245## LEX: Compile .l files to .cpp and then to .o.
246###########################################################
247
248lex_sources := $(filter %.l,$(LOCAL_SRC_FILES))
249lex_cpps := $(addprefix \
250 $(intermediates)/,$(lex_sources:.l=$(LOCAL_CPP_EXTENSION)))
251lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o)
252
253ifneq ($(strip $(lex_cpps)),)
254$(lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
255 $(TOPDIR)$(LOCAL_PATH)/%.l
256 $(transform-l-to-cpp)
257
258$(lex_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
259$(lex_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
260$(lex_objects): $(intermediates)/%.o: \
261 $(intermediates)/%$(LOCAL_CPP_EXTENSION) \
Patrick Scottd033d572009-05-19 18:13:58 -0400262 $(LOCAL_ADDITIONAL_DEPENDENCIES) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800263 $(yacc_headers)
264 $(transform-$(PRIVATE_HOST)cpp-to-o)
265endif
266
267###########################################################
268## C++: Compile .cpp files to .o.
269###########################################################
270
Jeff Browne33ba4c2011-07-11 22:11:46 -0700271# we also do this on host modules, even though
The Android Open Source Project88b60792009-03-03 19:28:42 -0800272# it's not really arm, because there are files that are shared.
273cpp_arm_sources := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(LOCAL_SRC_FILES)))
274cpp_arm_objects := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o))
275
276cpp_normal_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES))
277cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o))
278
279$(cpp_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode)
280$(cpp_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
281$(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
282$(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
283
284cpp_objects := $(cpp_arm_objects) $(cpp_normal_objects)
285
286ifneq ($(strip $(cpp_objects)),)
287$(cpp_objects): $(intermediates)/%.o: \
288 $(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
Ying Wanga5fc87a2010-11-02 18:43:16 -0700289 $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800290 $(transform-$(PRIVATE_HOST)cpp-to-o)
291-include $(cpp_objects:%.o=%.P)
292endif
293
294###########################################################
295## C++: Compile generated .cpp files to .o.
296###########################################################
297
298gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_GENERATED_SOURCES))
299gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o)
300
301ifneq ($(strip $(gen_cpp_objects)),)
302# Compile all generated files as thumb.
303# TODO: support compiling certain generated files as arm.
304$(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
305$(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700306$(gen_cpp_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800307 $(transform-$(PRIVATE_HOST)cpp-to-o)
308-include $(gen_cpp_objects:%.o=%.P)
309endif
310
311###########################################################
312## S: Compile generated .S and .s files to .o.
313###########################################################
314
315gen_S_sources := $(filter %.S,$(LOCAL_GENERATED_SOURCES))
316gen_S_objects := $(gen_S_sources:%.S=%.o)
317
318ifneq ($(strip $(gen_S_sources)),)
Patrick Scottd033d572009-05-19 18:13:58 -0400319$(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800320 $(transform-$(PRIVATE_HOST)s-to-o)
321-include $(gen_S_objects:%.o=%.P)
322endif
323
324gen_s_sources := $(filter %.s,$(LOCAL_GENERATED_SOURCES))
325gen_s_objects := $(gen_s_sources:%.s=%.o)
326
327ifneq ($(strip $(gen_s_objects)),)
Patrick Scottd033d572009-05-19 18:13:58 -0400328$(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800329 $(transform-$(PRIVATE_HOST)s-to-o-no-deps)
330-include $(gen_s_objects:%.o=%.P)
331endif
332
333gen_asm_objects := $(gen_S_objects) $(gen_s_objects)
334
335###########################################################
336## C: Compile .c files to .o.
337###########################################################
338
339c_arm_sources := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(LOCAL_SRC_FILES)))
340c_arm_objects := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o))
341
342c_normal_sources := $(filter %.c,$(LOCAL_SRC_FILES))
343c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o))
344
345$(c_arm_objects): PRIVATE_ARM_MODE := $(arm_objects_mode)
346$(c_arm_objects): PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
347$(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
348$(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
349
350c_objects := $(c_arm_objects) $(c_normal_objects)
351
352ifneq ($(strip $(c_objects)),)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700353$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800354 $(transform-$(PRIVATE_HOST)c-to-o)
355-include $(c_objects:%.o=%.P)
356endif
357
358###########################################################
Jack Paleviche7b3e2c2009-05-04 14:32:44 -0700359## C: Compile generated .c files to .o.
360###########################################################
361
362gen_c_sources := $(filter %.c,$(LOCAL_GENERATED_SOURCES))
363gen_c_objects := $(gen_c_sources:%.c=%.o)
364
365ifneq ($(strip $(gen_c_objects)),)
366# Compile all generated files as thumb.
367# TODO: support compiling certain generated files as arm.
368$(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
369$(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700370$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(proto_generated_headers) $(LOCAL_ADDITIONAL_DEPENDENCIES)
Jack Paleviche7b3e2c2009-05-04 14:32:44 -0700371 $(transform-$(PRIVATE_HOST)c-to-o)
372-include $(gen_c_objects:%.o=%.P)
373endif
374
375###########################################################
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +0200376## ObjC: Compile .m files to .o
377###########################################################
378
379objc_sources := $(filter %.m,$(LOCAL_SRC_FILES))
380objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o))
381
382ifneq ($(strip $(objc_objects)),)
Ying Wanga5fc87a2010-11-02 18:43:16 -0700383$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(proto_generated_headers) $(PRIVATE_ADDITIONAL_DEPENDENCIES)
David 'Digit' Turner5dbb5292009-05-14 16:00:09 +0200384 $(transform-$(PRIVATE_HOST)m-to-o)
385-include $(objc_objects:%.o=%.P)
386endif
387
388###########################################################
The Android Open Source Project88b60792009-03-03 19:28:42 -0800389## AS: Compile .S files to .o.
390###########################################################
391
392asm_sources_S := $(filter %.S,$(LOCAL_SRC_FILES))
393asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o))
394
395ifneq ($(strip $(asm_objects_S)),)
Patrick Scottd033d572009-05-19 18:13:58 -0400396$(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800397 $(transform-$(PRIVATE_HOST)s-to-o)
398-include $(asm_objects_S:%.o=%.P)
399endif
400
401asm_sources_s := $(filter %.s,$(LOCAL_SRC_FILES))
402asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o))
403
404ifneq ($(strip $(asm_objects_s)),)
Patrick Scottd033d572009-05-19 18:13:58 -0400405$(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800406 $(transform-$(PRIVATE_HOST)s-to-o-no-deps)
407-include $(asm_objects_s:%.o=%.P)
408endif
409
410asm_objects := $(asm_objects_S) $(asm_objects_s)
411
412
413###########################################################
414## Common object handling.
415###########################################################
416
417# some rules depend on asm_objects being first. If your code depends on
418# being first, it's reasonable to require it to be assembly
419all_objects := \
420 $(asm_objects) \
421 $(cpp_objects) \
422 $(gen_cpp_objects) \
423 $(gen_asm_objects) \
424 $(c_objects) \
Jack Paleviche7b3e2c2009-05-04 14:32:44 -0700425 $(gen_c_objects) \
David 'Digit' Turner5ca286d2011-02-11 16:19:31 +0100426 $(objc_objects) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800427 $(yacc_objects) \
428 $(lex_objects) \
Ying Wanga5fc87a2010-11-02 18:43:16 -0700429 $(proto_generated_objects) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800430 $(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
431
432LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(base_intermediates)
433
Ying Wangbce4b752010-07-22 15:51:56 -0700434ifndef LOCAL_NDK_VERSION
435 LOCAL_C_INCLUDES += $(JNI_H_INCLUDE)
436endif
437
The Android Open Source Project88b60792009-03-03 19:28:42 -0800438$(all_objects) : | $(LOCAL_GENERATED_SOURCES)
439ALL_C_CPP_ETC_OBJECTS += $(all_objects)
440
441###########################################################
442## Copy headers to the install tree
443###########################################################
444include $(BUILD_COPY_HEADERS)
445
446###########################################################
447# Standard library handling.
448#
449# On the target, we compile with -nostdlib, so we must add in the
450# default system shared libraries, unless they have requested not
451# to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value. One would
452# supply that, for example, when building libc itself.
453###########################################################
Ying Wang1a081002010-07-13 14:55:47 -0700454ifdef LOCAL_IS_HOST_MODULE
The Android Open Source Project88b60792009-03-03 19:28:42 -0800455 ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
Ying Wang1a081002010-07-13 14:55:47 -0700456 LOCAL_SYSTEM_SHARED_LIBRARIES :=
457 endif
458else
459 ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
460 LOCAL_SYSTEM_SHARED_LIBRARIES := $($(my_prefix)DEFAULT_SYSTEM_SHARED_LIBRARIES)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800461 endif
462endif
463
464# Logging used to be part of libcutils (target) and libutils (sim);
465# hack modules that use those other libs to also include liblog.
466# All of this complexity is to make sure that liblog only appears
467# once, and appears just before libcutils or libutils on the link
468# line.
469# TODO: remove this hack and change all modules to use liblog
470# when necessary.
471define insert-liblog
472 $(if $(filter liblog,$(1)),$(1), \
473 $(if $(filter libcutils,$(1)), \
474 $(patsubst libcutils,liblog libcutils,$(1)) \
475 , \
476 $(patsubst libutils,liblog libutils,$(1)) \
477 ) \
478 )
479endef
480ifneq (,$(filter libcutils libutils,$(LOCAL_SHARED_LIBRARIES)))
481 LOCAL_SHARED_LIBRARIES := $(call insert-liblog,$(LOCAL_SHARED_LIBRARIES))
482endif
483ifneq (,$(filter libcutils libutils,$(LOCAL_STATIC_LIBRARIES)))
484 LOCAL_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_STATIC_LIBRARIES))
485endif
486ifneq (,$(filter libcutils libutils,$(LOCAL_WHOLE_STATIC_LIBRARIES)))
487 LOCAL_WHOLE_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_WHOLE_STATIC_LIBRARIES))
488endif
489
490###########################################################
491# The list of libraries that this module will link against are in
492# these variables. Each is a list of bare module names like "libc libm".
493#
494# LOCAL_SHARED_LIBRARIES
495# LOCAL_STATIC_LIBRARIES
496# LOCAL_WHOLE_STATIC_LIBRARIES
497#
498# We need to convert the bare names into the dependencies that
499# we'll use for LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE.
500# LOCAL_BUILT_MODULE should depend on the BUILT versions of the
501# libraries, so that simply building this module doesn't force
502# an install of a library. Similarly, LOCAL_INSTALLED_MODULE
503# should depend on the INSTALLED versions of the libraries so
504# that they get installed when this module does.
505###########################################################
506# NOTE:
507# WHOLE_STATIC_LIBRARIES are libraries that are pulled into the
508# module without leaving anything out, which is useful for turning
509# a collection of .a files into a .so file. Linking against a
510# normal STATIC_LIBRARY will only pull in code/symbols that are
511# referenced by the module. (see gcc/ld's --whole-archive option)
512###########################################################
513
514# Get the list of BUILT libraries, which are under
515# various intermediates directories.
516so_suffix := $($(my_prefix)SHLIB_SUFFIX)
517a_suffix := $($(my_prefix)STATIC_LIB_SUFFIX)
518
Ying Wang1a081002010-07-13 14:55:47 -0700519ifdef LOCAL_NDK_VERSION
The Android Open Source Project88b60792009-03-03 19:28:42 -0800520built_shared_libraries := \
521 $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
522 $(addsuffix $(so_suffix), \
523 $(LOCAL_SHARED_LIBRARIES)))
524
Ying Wang1a081002010-07-13 14:55:47 -0700525# Get the list of INSTALLED libraries. Strip off the various
526# intermediates directories and point to the common lib dirs.
527installed_shared_libraries := \
528 $(addprefix $($(my_prefix)OUT_SHARED_LIBRARIES)/, \
529 $(notdir $(built_shared_libraries)))
530
Ying Wangcce4c972011-03-03 18:53:53 -0800531my_system_shared_libraries_fullpath := \
532 $(my_ndk_stl_shared_lib_fullpath) \
533 $(addprefix $(my_ndk_version_root)/usr/lib/, \
534 $(addsuffix $(so_suffix), $(LOCAL_SYSTEM_SHARED_LIBRARIES)))
Ying Wang1a081002010-07-13 14:55:47 -0700535
536built_shared_libraries += $(my_system_shared_libraries_fullpath)
537LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
538else
539LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
540built_shared_libraries := \
541 $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
542 $(addsuffix $(so_suffix), \
543 $(LOCAL_SHARED_LIBRARIES)))
544
545installed_shared_libraries := \
546 $(addprefix $($(my_prefix)OUT_SHARED_LIBRARIES)/, \
547 $(notdir $(built_shared_libraries)))
548endif
549
The Android Open Source Project88b60792009-03-03 19:28:42 -0800550built_static_libraries := \
551 $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
552 $(call intermediates-dir-for, \
553 STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
554
Ying Wangcce4c972011-03-03 18:53:53 -0800555ifdef LOCAL_NDK_VERSION
556built_static_libraries += $(my_ndk_stl_static_lib)
557endif
558
The Android Open Source Project88b60792009-03-03 19:28:42 -0800559built_whole_libraries := \
560 $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES), \
561 $(call intermediates-dir-for, \
562 STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
563
The Android Open Source Project88b60792009-03-03 19:28:42 -0800564# We don't care about installed static libraries, since the
565# libraries have already been linked into the module at that point.
566# We do, however, care about the NOTICE files for any static
567# libraries that we use. (see notice_files.make)
568
569installed_static_library_notice_file_targets := \
570 $(foreach lib,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \
571 NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib))
572
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700573# Default is -fno-rtti.
Doug Kwane3c3c6d2011-06-07 10:55:48 -0700574ifeq ($(strip $(LOCAL_RTTI_FLAG)),)
575LOCAL_RTTI_FLAG := -fno-rtti
576endif
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700577
The Android Open Source Project88b60792009-03-03 19:28:42 -0800578###########################################################
579# Rule-specific variable definitions
580###########################################################
581$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
582$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(LOCAL_ASFLAGS)
583$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS)
584$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS)
Doug Kwan9a8ecf92011-05-10 21:50:58 -0700585$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_RTTI_FLAG := $(LOCAL_RTTI_FLAG)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800586$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
587$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
588$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
589$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
Jeff Brown703e7c62011-02-04 20:15:00 -0800590$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_CRT := $(LOCAL_NO_CRT)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800591
592# this is really the way to get the files onto the command line instead
593# of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work
594$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)
595$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)
596$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)
597$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects)
598
599###########################################################
600# Define library dependencies.
601###########################################################
602# all_libraries is used for the dependencies on LOCAL_BUILT_MODULE.
603all_libraries := \
604 $(built_shared_libraries) \
605 $(built_static_libraries) \
606 $(built_whole_libraries)
607
608# Make LOCAL_INSTALLED_MODULE depend on the installed versions of the
609# libraries so they get installed along with it. We don't need to
610# rebuild it when installing it, though, so this can be an order-only
611# dependency.
612$(LOCAL_INSTALLED_MODULE): | $(installed_shared_libraries)
613
614# Also depend on the notice files for any static libraries that
615# are linked into this module. This will force them to be installed
616# when this module is.
617$(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets)