binary.mk revision 20d1ba602b8f56cc396a213f6beecac500af02e2
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
8#######################################
9include $(BUILD_SYSTEM)/base_rules.mk
10#######################################
11
12####################################################
13## Add FDO flags if FDO is turned on and supported
14####################################################
15ifeq ($(strip $(LOCAL_NO_FDO_SUPPORT)),)
16  LOCAL_CFLAGS += $(TARGET_FDO_CFLAGS)
17  LOCAL_CPPFLAGS += $(TARGET_FDO_CFLAGS)
18  LOCAL_LDFLAGS += $(TARGET_FDO_CFLAGS)
19endif
20
21###########################################################
22## Explicitly declare assembly-only __ASSEMBLY__ macro for
23## assembly source
24###########################################################
25LOCAL_ASFLAGS += -D__ASSEMBLY__
26
27###########################################################
28## Define PRIVATE_ variables used by multiple module types
29###########################################################
30$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_NO_DEFAULT_COMPILER_FLAGS := \
31	$(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS))
32
33ifeq ($(strip $(LOCAL_CC)),)
34  LOCAL_CC := $($(my_prefix)CC)
35endif
36$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CC := $(LOCAL_CC)
37
38ifeq ($(strip $(LOCAL_CXX)),)
39  LOCAL_CXX := $($(my_prefix)CXX)
40endif
41$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CXX := $(LOCAL_CXX)
42
43# TODO: support a mix of standard extensions so that this isn't necessary
44LOCAL_CPP_EXTENSION := $(strip $(LOCAL_CPP_EXTENSION))
45ifeq ($(LOCAL_CPP_EXTENSION),)
46  LOCAL_CPP_EXTENSION := .cpp
47endif
48$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPP_EXTENSION := $(LOCAL_CPP_EXTENSION)
49
50# Certain modules like libdl have to have symbols resolved at runtime and blow
51# up if --no-undefined is passed to the linker.
52ifeq ($(strip $(LOCAL_NO_DEFAULT_COMPILER_FLAGS)),)
53ifeq ($(strip $(LOCAL_ALLOW_UNDEFINED_SYMBOLS)),)
54  LOCAL_LDFLAGS := $(LOCAL_LDFLAGS) $($(my_prefix)NO_UNDEFINED_LDFLAGS)
55endif
56endif
57
58###########################################################
59## Define arm-vs-thumb-mode flags.
60###########################################################
61LOCAL_ARM_MODE := $(strip $(LOCAL_ARM_MODE))
62ifeq ($(TARGET_ARCH),arm)
63arm_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),arm)
64normal_objects_mode := $(if $(LOCAL_ARM_MODE),$(LOCAL_ARM_MODE),thumb)
65
66# Read the values from something like TARGET_arm_CFLAGS or
67# TARGET_thumb_CFLAGS.  HOST_(arm|thumb)_CFLAGS values aren't
68# actually used (although they are usually empty).
69arm_objects_cflags := $($(my_prefix)$(arm_objects_mode)_CFLAGS)
70normal_objects_cflags := $($(my_prefix)$(normal_objects_mode)_CFLAGS)
71else
72arm_objects_mode :=
73normal_objects_mode :=
74arm_objects_cflags :=
75normal_objects_cflags :=
76endif
77
78###########################################################
79## Define per-module debugging flags.  Users can turn on
80## debugging for a particular module by setting DEBUG_MODULE_ModuleName
81## to a non-empty value in their environment or buildspec.mk,
82## and setting HOST_/TARGET_CUSTOM_DEBUG_CFLAGS to the
83## debug flags that they want to use.
84###########################################################
85ifdef DEBUG_MODULE_$(strip $(LOCAL_MODULE))
86  debug_cflags := $($(my_prefix)CUSTOM_DEBUG_CFLAGS)
87else
88  debug_cflags :=
89endif
90
91###########################################################
92## Stuff source generated from one-off tools
93###########################################################
94$(LOCAL_GENERATED_SOURCES): PRIVATE_MODULE := $(LOCAL_MODULE)
95
96ALL_GENERATED_SOURCES += $(LOCAL_GENERATED_SOURCES)
97
98
99###########################################################
100## YACC: Compile .y files to .cpp and the to .o.
101###########################################################
102
103yacc_sources := $(filter %.y,$(LOCAL_SRC_FILES))
104yacc_cpps := $(addprefix \
105	$(intermediates)/,$(yacc_sources:.y=$(LOCAL_CPP_EXTENSION)))
106yacc_headers := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.h)
107yacc_objects := $(yacc_cpps:$(LOCAL_CPP_EXTENSION)=.o)
108
109ifneq ($(strip $(yacc_cpps)),)
110$(yacc_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
111		$(TOPDIR)$(LOCAL_PATH)/%.y \
112		$(lex_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
113	$(call transform-y-to-cpp,$(PRIVATE_CPP_EXTENSION))
114$(yacc_headers): $(intermediates)/%.h: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
115
116$(yacc_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
117$(yacc_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
118$(yacc_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION)
119	$(transform-$(PRIVATE_HOST)cpp-to-o)
120endif
121
122###########################################################
123## LEX: Compile .l files to .cpp and then to .o.
124###########################################################
125
126lex_sources := $(filter %.l,$(LOCAL_SRC_FILES))
127lex_cpps := $(addprefix \
128	$(intermediates)/,$(lex_sources:.l=$(LOCAL_CPP_EXTENSION)))
129lex_objects := $(lex_cpps:$(LOCAL_CPP_EXTENSION)=.o)
130
131ifneq ($(strip $(lex_cpps)),)
132$(lex_cpps): $(intermediates)/%$(LOCAL_CPP_EXTENSION): \
133		$(TOPDIR)$(LOCAL_PATH)/%.l
134	$(transform-l-to-cpp)
135
136$(lex_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
137$(lex_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
138$(lex_objects): $(intermediates)/%.o: \
139		$(intermediates)/%$(LOCAL_CPP_EXTENSION) \
140		$(LOCAL_ADDITIONAL_DEPENDENCIES) \
141		$(yacc_headers)
142	$(transform-$(PRIVATE_HOST)cpp-to-o)
143endif
144
145###########################################################
146## C++: Compile .cpp files to .o.
147###########################################################
148
149# we also do this on host modules and sim builds, even though
150# it's not really arm, because there are files that are shared.
151cpp_arm_sources    := $(patsubst %$(LOCAL_CPP_EXTENSION).arm,%$(LOCAL_CPP_EXTENSION),$(filter %$(LOCAL_CPP_EXTENSION).arm,$(LOCAL_SRC_FILES)))
152cpp_arm_objects    := $(addprefix $(intermediates)/,$(cpp_arm_sources:$(LOCAL_CPP_EXTENSION)=.o))
153
154cpp_normal_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_SRC_FILES))
155cpp_normal_objects := $(addprefix $(intermediates)/,$(cpp_normal_sources:$(LOCAL_CPP_EXTENSION)=.o))
156
157$(cpp_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
158$(cpp_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
159$(cpp_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
160$(cpp_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
161
162cpp_objects        := $(cpp_arm_objects) $(cpp_normal_objects)
163
164ifneq ($(strip $(cpp_objects)),)
165$(cpp_objects): $(intermediates)/%.o: \
166		$(TOPDIR)$(LOCAL_PATH)/%$(LOCAL_CPP_EXTENSION) \
167		$(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
168	$(transform-$(PRIVATE_HOST)cpp-to-o)
169-include $(cpp_objects:%.o=%.P)
170endif
171
172###########################################################
173## C++: Compile generated .cpp files to .o.
174###########################################################
175
176gen_cpp_sources := $(filter %$(LOCAL_CPP_EXTENSION),$(LOCAL_GENERATED_SOURCES))
177gen_cpp_objects := $(gen_cpp_sources:%$(LOCAL_CPP_EXTENSION)=%.o)
178
179ifneq ($(strip $(gen_cpp_objects)),)
180# Compile all generated files as thumb.
181# TODO: support compiling certain generated files as arm.
182$(gen_cpp_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
183$(gen_cpp_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
184$(gen_cpp_objects): $(intermediates)/%.o: $(intermediates)/%$(LOCAL_CPP_EXTENSION) $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
185	$(transform-$(PRIVATE_HOST)cpp-to-o)
186-include $(gen_cpp_objects:%.o=%.P)
187endif
188
189###########################################################
190## S: Compile generated .S and .s files to .o.
191###########################################################
192
193gen_S_sources := $(filter %.S,$(LOCAL_GENERATED_SOURCES))
194gen_S_objects := $(gen_S_sources:%.S=%.o)
195
196ifneq ($(strip $(gen_S_sources)),)
197$(gen_S_objects): $(intermediates)/%.o: $(intermediates)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
198	$(transform-$(PRIVATE_HOST)s-to-o)
199-include $(gen_S_objects:%.o=%.P)
200endif
201
202gen_s_sources := $(filter %.s,$(LOCAL_GENERATED_SOURCES))
203gen_s_objects := $(gen_s_sources:%.s=%.o)
204
205ifneq ($(strip $(gen_s_objects)),)
206$(gen_s_objects): $(intermediates)/%.o: $(intermediates)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
207	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
208-include $(gen_s_objects:%.o=%.P)
209endif
210
211gen_asm_objects := $(gen_S_objects) $(gen_s_objects)
212
213###########################################################
214## C: Compile .c files to .o.
215###########################################################
216
217c_arm_sources    := $(patsubst %.c.arm,%.c,$(filter %.c.arm,$(LOCAL_SRC_FILES)))
218c_arm_objects    := $(addprefix $(intermediates)/,$(c_arm_sources:.c=.o))
219
220c_normal_sources := $(filter %.c,$(LOCAL_SRC_FILES))
221c_normal_objects := $(addprefix $(intermediates)/,$(c_normal_sources:.c=.o))
222
223$(c_arm_objects):    PRIVATE_ARM_MODE := $(arm_objects_mode)
224$(c_arm_objects):    PRIVATE_ARM_CFLAGS := $(arm_objects_cflags)
225$(c_normal_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
226$(c_normal_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
227
228c_objects        := $(c_arm_objects) $(c_normal_objects)
229
230ifneq ($(strip $(c_objects)),)
231$(c_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.c $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
232	$(transform-$(PRIVATE_HOST)c-to-o)
233-include $(c_objects:%.o=%.P)
234endif
235
236###########################################################
237## C: Compile generated .c files to .o.
238###########################################################
239
240gen_c_sources := $(filter %.c,$(LOCAL_GENERATED_SOURCES))
241gen_c_objects := $(gen_c_sources:%.c=%.o)
242
243ifneq ($(strip $(gen_c_objects)),)
244# Compile all generated files as thumb.
245# TODO: support compiling certain generated files as arm.
246$(gen_c_objects): PRIVATE_ARM_MODE := $(normal_objects_mode)
247$(gen_c_objects): PRIVATE_ARM_CFLAGS := $(normal_objects_cflags)
248$(gen_c_objects): $(intermediates)/%.o: $(intermediates)/%.c $(yacc_cpps) $(LOCAL_ADDITIONAL_DEPENDENCIES)
249	$(transform-$(PRIVATE_HOST)c-to-o)
250-include $(gen_c_objects:%.o=%.P)
251endif
252
253###########################################################
254## ObjC: Compile .m files to .o
255###########################################################
256
257objc_sources := $(filter %.m,$(LOCAL_SRC_FILES))
258objc_objects := $(addprefix $(intermediates)/,$(objc_sources:.m=.o))
259
260ifneq ($(strip $(objc_objects)),)
261$(objc_objects): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.m $(yacc_cpps) $(PRIVATE_ADDITIONAL_DEPENDENCIES)
262	$(transform-$(PRIVATE_HOST)m-to-o)
263-include $(objc_objects:%.o=%.P)
264endif
265
266###########################################################
267## AS: Compile .S files to .o.
268###########################################################
269
270asm_sources_S := $(filter %.S,$(LOCAL_SRC_FILES))
271asm_objects_S := $(addprefix $(intermediates)/,$(asm_sources_S:.S=.o))
272
273ifneq ($(strip $(asm_objects_S)),)
274$(asm_objects_S): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.S $(LOCAL_ADDITIONAL_DEPENDENCIES)
275	$(transform-$(PRIVATE_HOST)s-to-o)
276-include $(asm_objects_S:%.o=%.P)
277endif
278
279asm_sources_s := $(filter %.s,$(LOCAL_SRC_FILES))
280asm_objects_s := $(addprefix $(intermediates)/,$(asm_sources_s:.s=.o))
281
282ifneq ($(strip $(asm_objects_s)),)
283$(asm_objects_s): $(intermediates)/%.o: $(TOPDIR)$(LOCAL_PATH)/%.s $(LOCAL_ADDITIONAL_DEPENDENCIES)
284	$(transform-$(PRIVATE_HOST)s-to-o-no-deps)
285-include $(asm_objects_s:%.o=%.P)
286endif
287
288asm_objects := $(asm_objects_S) $(asm_objects_s)
289
290
291###########################################################
292## Common object handling.
293###########################################################
294
295# some rules depend on asm_objects being first.  If your code depends on
296# being first, it's reasonable to require it to be assembly
297all_objects := \
298	$(asm_objects) \
299	$(cpp_objects) \
300	$(gen_cpp_objects) \
301	$(gen_asm_objects) \
302	$(c_objects) \
303	$(gen_c_objects) \
304	$(yacc_objects) \
305	$(lex_objects) \
306	$(addprefix $(TOPDIR)$(LOCAL_PATH)/,$(LOCAL_PREBUILT_OBJ_FILES))
307
308LOCAL_C_INCLUDES += $(TOPDIR)$(LOCAL_PATH) $(intermediates) $(base_intermediates)
309
310$(all_objects) : | $(LOCAL_GENERATED_SOURCES)
311ALL_C_CPP_ETC_OBJECTS += $(all_objects)
312
313###########################################################
314## Copy headers to the install tree
315###########################################################
316include $(BUILD_COPY_HEADERS)
317
318###########################################################
319# Standard library handling.
320#
321# On the target, we compile with -nostdlib, so we must add in the
322# default system shared libraries, unless they have requested not
323# to by supplying a LOCAL_SYSTEM_SHARED_LIBRARIES value.  One would
324# supply that, for example, when building libc itself.
325###########################################################
326ifndef LOCAL_IS_HOST_MODULE
327  ifeq ($(LOCAL_SYSTEM_SHARED_LIBRARIES),none)
328    LOCAL_SHARED_LIBRARIES += $($(my_prefix)DEFAULT_SYSTEM_SHARED_LIBRARIES)
329  else
330    LOCAL_SHARED_LIBRARIES += $(LOCAL_SYSTEM_SHARED_LIBRARIES)
331  endif
332endif
333
334# Logging used to be part of libcutils (target) and libutils (sim);
335# hack modules that use those other libs to also include liblog.
336# All of this complexity is to make sure that liblog only appears
337# once, and appears just before libcutils or libutils on the link
338# line.
339# TODO: remove this hack and change all modules to use liblog
340# when necessary.
341define insert-liblog
342  $(if $(filter liblog,$(1)),$(1), \
343    $(if $(filter libcutils,$(1)), \
344      $(patsubst libcutils,liblog libcutils,$(1)) \
345     , \
346      $(patsubst libutils,liblog libutils,$(1)) \
347     ) \
348   )
349endef
350ifneq (,$(filter libcutils libutils,$(LOCAL_SHARED_LIBRARIES)))
351  LOCAL_SHARED_LIBRARIES := $(call insert-liblog,$(LOCAL_SHARED_LIBRARIES))
352endif
353ifneq (,$(filter libcutils libutils,$(LOCAL_STATIC_LIBRARIES)))
354  LOCAL_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_STATIC_LIBRARIES))
355endif
356ifneq (,$(filter libcutils libutils,$(LOCAL_WHOLE_STATIC_LIBRARIES)))
357  LOCAL_WHOLE_STATIC_LIBRARIES := $(call insert-liblog,$(LOCAL_WHOLE_STATIC_LIBRARIES))
358endif
359
360###########################################################
361# The list of libraries that this module will link against are in
362# these variables.  Each is a list of bare module names like "libc libm".
363#
364# LOCAL_SHARED_LIBRARIES
365# LOCAL_STATIC_LIBRARIES
366# LOCAL_WHOLE_STATIC_LIBRARIES
367#
368# We need to convert the bare names into the dependencies that
369# we'll use for LOCAL_BUILT_MODULE and LOCAL_INSTALLED_MODULE.
370# LOCAL_BUILT_MODULE should depend on the BUILT versions of the
371# libraries, so that simply building this module doesn't force
372# an install of a library.  Similarly, LOCAL_INSTALLED_MODULE
373# should depend on the INSTALLED versions of the libraries so
374# that they get installed when this module does.
375###########################################################
376# NOTE:
377# WHOLE_STATIC_LIBRARIES are libraries that are pulled into the
378# module without leaving anything out, which is useful for turning
379# a collection of .a files into a .so file.  Linking against a
380# normal STATIC_LIBRARY will only pull in code/symbols that are
381# referenced by the module. (see gcc/ld's --whole-archive option)
382###########################################################
383
384# Get the list of BUILT libraries, which are under
385# various intermediates directories.
386so_suffix := $($(my_prefix)SHLIB_SUFFIX)
387a_suffix := $($(my_prefix)STATIC_LIB_SUFFIX)
388
389built_shared_libraries := \
390    $(addprefix $($(my_prefix)OUT_INTERMEDIATE_LIBRARIES)/, \
391      $(addsuffix $(so_suffix), \
392        $(LOCAL_SHARED_LIBRARIES)))
393
394built_static_libraries := \
395    $(foreach lib,$(LOCAL_STATIC_LIBRARIES), \
396      $(call intermediates-dir-for, \
397        STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
398
399built_whole_libraries := \
400    $(foreach lib,$(LOCAL_WHOLE_STATIC_LIBRARIES), \
401      $(call intermediates-dir-for, \
402        STATIC_LIBRARIES,$(lib),$(LOCAL_IS_HOST_MODULE))/$(lib)$(a_suffix))
403
404# Get the list of INSTALLED libraries.  Strip off the various
405# intermediates directories and point to the common lib dirs.
406installed_shared_libraries := \
407    $(addprefix $($(my_prefix)OUT_SHARED_LIBRARIES)/, \
408      $(notdir $(built_shared_libraries)))
409
410# We don't care about installed static libraries, since the
411# libraries have already been linked into the module at that point.
412# We do, however, care about the NOTICE files for any static
413# libraries that we use. (see notice_files.make)
414
415installed_static_library_notice_file_targets := \
416    $(foreach lib,$(LOCAL_STATIC_LIBRARIES) $(LOCAL_WHOLE_STATIC_LIBRARIES), \
417      NOTICE-$(if $(LOCAL_IS_HOST_MODULE),HOST,TARGET)-STATIC_LIBRARIES-$(lib))
418
419###########################################################
420# Rule-specific variable definitions
421###########################################################
422$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_YACCFLAGS := $(LOCAL_YACCFLAGS)
423$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ASFLAGS := $(LOCAL_ASFLAGS)
424$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CFLAGS := $(LOCAL_CFLAGS)
425$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_CPPFLAGS := $(LOCAL_CPPFLAGS)
426$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_DEBUG_CFLAGS := $(debug_cflags)
427$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_C_INCLUDES := $(LOCAL_C_INCLUDES)
428$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDFLAGS := $(LOCAL_LDFLAGS)
429$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_LDLIBS := $(LOCAL_LDLIBS)
430
431# this is really the way to get the files onto the command line instead
432# of using $^, because then LOCAL_ADDITIONAL_DEPENDENCIES doesn't work
433$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_SHARED_LIBRARIES := $(built_shared_libraries)
434$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_STATIC_LIBRARIES := $(built_static_libraries)
435$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_WHOLE_STATIC_LIBRARIES := $(built_whole_libraries)
436$(LOCAL_INTERMEDIATE_TARGETS): PRIVATE_ALL_OBJECTS := $(all_objects)
437
438###########################################################
439# Define library dependencies.
440###########################################################
441# all_libraries is used for the dependencies on LOCAL_BUILT_MODULE.
442all_libraries := \
443    $(built_shared_libraries) \
444    $(built_static_libraries) \
445    $(built_whole_libraries)
446
447# Make LOCAL_INSTALLED_MODULE depend on the installed versions of the
448# libraries so they get installed along with it.  We don't need to
449# rebuild it when installing it, though, so this can be an order-only
450# dependency.
451$(LOCAL_INSTALLED_MODULE): | $(installed_shared_libraries)
452
453# Also depend on the notice files for any static libraries that
454# are linked into this module.  This will force them to be installed
455# when this module is.
456$(LOCAL_INSTALLED_MODULE): | $(installed_static_library_notice_file_targets)
457