xref: /aosp_15_r20/external/crosvm/third_party/minigbm/common.mk (revision d95af8df99a05bcb8679a54dc3ab8e5cd312b38e)
1*d95af8dfSAndroid Build Coastguard Worker# Copyright 2012 The ChromiumOS Authors
2*d95af8dfSAndroid Build Coastguard Worker# Use of this source code is governed by a BSD-style license that can be
3*d95af8dfSAndroid Build Coastguard Worker# found in the LICENSE file.
4*d95af8dfSAndroid Build Coastguard Worker#
5*d95af8dfSAndroid Build Coastguard Worker# If this file is part of another source distribution, it's license may be
6*d95af8dfSAndroid Build Coastguard Worker# stored in LICENSE.makefile or LICENSE.common.mk.
7*d95af8dfSAndroid Build Coastguard Worker#
8*d95af8dfSAndroid Build Coastguard Worker# NOTE NOTE NOTE
9*d95af8dfSAndroid Build Coastguard Worker#  The authoritative common.mk is located in:
10*d95af8dfSAndroid Build Coastguard Worker#    https://chromium.googlesource.com/chromiumos/platform2/+/HEAD/common-mk
11*d95af8dfSAndroid Build Coastguard Worker#  Please make all changes there, then copy into place in other repos.
12*d95af8dfSAndroid Build Coastguard Worker# NOTE NOTE NOTE
13*d95af8dfSAndroid Build Coastguard Worker#
14*d95af8dfSAndroid Build Coastguard Worker# This file provides a common architecture for building C/C++ source trees.
15*d95af8dfSAndroid Build Coastguard Worker# It uses recursive makefile inclusion to create a single make process which
16*d95af8dfSAndroid Build Coastguard Worker# can be built in the source tree or with the build artifacts placed elsewhere.
17*d95af8dfSAndroid Build Coastguard Worker#
18*d95af8dfSAndroid Build Coastguard Worker# It is fully parallelizable for all targets, including static archives.
19*d95af8dfSAndroid Build Coastguard Worker#
20*d95af8dfSAndroid Build Coastguard Worker# To use:
21*d95af8dfSAndroid Build Coastguard Worker# 1. Place common.mk in your top source level
22*d95af8dfSAndroid Build Coastguard Worker# 2. In your top-level Makefile, place "include common.mk" at the top
23*d95af8dfSAndroid Build Coastguard Worker# 3. In all subdirectories, create a 'module.mk' file that starts with:
24*d95af8dfSAndroid Build Coastguard Worker#      include common.mk
25*d95af8dfSAndroid Build Coastguard Worker#    And then contains the remainder of your targets.
26*d95af8dfSAndroid Build Coastguard Worker# 4. All build targets should look like:
27*d95af8dfSAndroid Build Coastguard Worker#    relative/path/target: relative/path/obj.o
28*d95af8dfSAndroid Build Coastguard Worker#
29*d95af8dfSAndroid Build Coastguard Worker# See existing makefiles for rule examples.
30*d95af8dfSAndroid Build Coastguard Worker#
31*d95af8dfSAndroid Build Coastguard Worker# Exported macros:
32*d95af8dfSAndroid Build Coastguard Worker#   - cc_binary, cxx_binary provide standard compilation steps for binaries
33*d95af8dfSAndroid Build Coastguard Worker#   - cxx_library, cc_library provide standard compilation steps for
34*d95af8dfSAndroid Build Coastguard Worker#     shared objects.
35*d95af8dfSAndroid Build Coastguard Worker#   All of the above optionally take an argument for extra flags.
36*d95af8dfSAndroid Build Coastguard Worker#   - update_archive creates/updates a given .a target
37*d95af8dfSAndroid Build Coastguard Worker#
38*d95af8dfSAndroid Build Coastguard Worker# Instead of using the build macros, most users can just use wrapped targets:
39*d95af8dfSAndroid Build Coastguard Worker#   - CXX_BINARY, CC_BINARY, CC_STATIC_BINARY, CXX_STATIC_BINARY
40*d95af8dfSAndroid Build Coastguard Worker#   - CXX_LIBRARY, CC_LIBRARY, CC_STATIC_LIBRARY, CXX_STATIC_LIBRARY
41*d95af8dfSAndroid Build Coastguard Worker#   - E.g., CXX_BINARY(mahbinary): foo.o
42*d95af8dfSAndroid Build Coastguard Worker#   - object.depends targets may be used when a prerequisite is required for an
43*d95af8dfSAndroid Build Coastguard Worker#     object file. Because object files result in multiple build artifacts to
44*d95af8dfSAndroid Build Coastguard Worker#     handle PIC and PIE weirdness. E.g.
45*d95af8dfSAndroid Build Coastguard Worker#       foo.o.depends: generated/dbus.h
46*d95af8dfSAndroid Build Coastguard Worker#   - TEST(binary) or TEST(CXX_BINARY(binary)) may be used as a prerequisite
47*d95af8dfSAndroid Build Coastguard Worker#     for the tests target to trigger an automated test run.
48*d95af8dfSAndroid Build Coastguard Worker#   - CLEAN(file_or_dir) dependency can be added to 'clean'.
49*d95af8dfSAndroid Build Coastguard Worker#
50*d95af8dfSAndroid Build Coastguard Worker# If source code is being generated, rules will need to be registered for
51*d95af8dfSAndroid Build Coastguard Worker# compiling the objects.  This can be done by adding one of the following
52*d95af8dfSAndroid Build Coastguard Worker# to the Makefile:
53*d95af8dfSAndroid Build Coastguard Worker#   - For C source files
54*d95af8dfSAndroid Build Coastguard Worker#   $(eval $(call add_object_rules,sub/dir/gen_a.o sub/dir/b.o,CC,c,CFLAGS))
55*d95af8dfSAndroid Build Coastguard Worker#   - For C++ source files
56*d95af8dfSAndroid Build Coastguard Worker#   $(eval $(call add_object_rules,sub/dir/gen_a.o sub/dir/b.o,CXX,cc,CXXFLAGS))
57*d95af8dfSAndroid Build Coastguard Worker#
58*d95af8dfSAndroid Build Coastguard Worker# Exported targets meant to have prerequisites added to:
59*d95af8dfSAndroid Build Coastguard Worker#  - all - Your desired targets should be given
60*d95af8dfSAndroid Build Coastguard Worker#  - tests - Any TEST(test_binary) targets should be given
61*d95af8dfSAndroid Build Coastguard Worker#  - FORCE - force the given target to run regardless of changes
62*d95af8dfSAndroid Build Coastguard Worker#            In most cases, using .PHONY is preferred.
63*d95af8dfSAndroid Build Coastguard Worker#
64*d95af8dfSAndroid Build Coastguard Worker# Possible command line variables:
65*d95af8dfSAndroid Build Coastguard Worker#   - COLOR=[0|1] to set ANSI color output (default: 1)
66*d95af8dfSAndroid Build Coastguard Worker#   - VERBOSE=[0|1] V=[0|1] to hide/show commands (default: 0)
67*d95af8dfSAndroid Build Coastguard Worker#   - MODE=[opt|dbg|profiling] (default: opt)
68*d95af8dfSAndroid Build Coastguard Worker#          opt - Enable optimizations for release builds
69*d95af8dfSAndroid Build Coastguard Worker#          dbg - Turn down optimization for debugging
70*d95af8dfSAndroid Build Coastguard Worker#          profiling - Turn off optimization and turn on profiling/coverage
71*d95af8dfSAndroid Build Coastguard Worker#                      support.
72*d95af8dfSAndroid Build Coastguard Worker#   - ARCH=[x86|arm|supported qemu name] (default: from portage or uname -m)
73*d95af8dfSAndroid Build Coastguard Worker#   - SPLITDEBUG=[0|1] splits debug info in target.debug (default: 0)
74*d95af8dfSAndroid Build Coastguard Worker#        If NOSTRIP=1, SPLITDEBUG will never strip the final emitted objects.
75*d95af8dfSAndroid Build Coastguard Worker#   - NOSTRIP=[0|1] determines if binaries are stripped. (default: 1)
76*d95af8dfSAndroid Build Coastguard Worker#        NOSTRIP=0 and MODE=opt will also drop -g from the CFLAGS.
77*d95af8dfSAndroid Build Coastguard Worker#   - VALGRIND=[0|1] runs tests under valgrind (default: 0)
78*d95af8dfSAndroid Build Coastguard Worker#   - OUT=/path/to/builddir puts all output in given path (default: $PWD)
79*d95af8dfSAndroid Build Coastguard Worker#   - VALGRIND_ARGS="" supplies extra memcheck arguments
80*d95af8dfSAndroid Build Coastguard Worker#
81*d95af8dfSAndroid Build Coastguard Worker# Per-target(-ish) variable:
82*d95af8dfSAndroid Build Coastguard Worker#   - NEEDS_ROOT=[0|1] allows a TEST() target to run with root.
83*d95af8dfSAndroid Build Coastguard Worker#     Default is 0 unless it is running under QEmu.
84*d95af8dfSAndroid Build Coastguard Worker#   - NEEDS_MOUNTS=[0|1] allows a TEST() target running on QEmu to get
85*d95af8dfSAndroid Build Coastguard Worker#     setup mounts in the $(SYSROOT)
86*d95af8dfSAndroid Build Coastguard Worker#
87*d95af8dfSAndroid Build Coastguard Worker# Caveats:
88*d95af8dfSAndroid Build Coastguard Worker# - Directories or files with spaces in them DO NOT get along with GNU Make.
89*d95af8dfSAndroid Build Coastguard Worker#   If you need them, all uses of dir/notdir/etc will need to have magic
90*d95af8dfSAndroid Build Coastguard Worker#   wrappers.  Proceed at risk to your own sanity.
91*d95af8dfSAndroid Build Coastguard Worker# - External CXXFLAGS and CFLAGS should be passed via the environment since
92*d95af8dfSAndroid Build Coastguard Worker#   this file does not use 'override' to control them.
93*d95af8dfSAndroid Build Coastguard Worker# - Our version of GNU Make doesn't seem to support the 'private' variable
94*d95af8dfSAndroid Build Coastguard Worker#   annotation, so you can't tag a variable private on a wrapping target.
95*d95af8dfSAndroid Build Coastguard Worker
96*d95af8dfSAndroid Build Coastguard Worker# Behavior configuration variables
97*d95af8dfSAndroid Build Coastguard WorkerSPLITDEBUG ?= 0
98*d95af8dfSAndroid Build Coastguard WorkerNOSTRIP ?= 1
99*d95af8dfSAndroid Build Coastguard WorkerVALGRIND ?= 0
100*d95af8dfSAndroid Build Coastguard WorkerCOLOR ?= 1
101*d95af8dfSAndroid Build Coastguard WorkerV ?= 0
102*d95af8dfSAndroid Build Coastguard WorkerVERBOSE ?= $(V)
103*d95af8dfSAndroid Build Coastguard WorkerMODE ?= opt
104*d95af8dfSAndroid Build Coastguard WorkerCXXEXCEPTIONS ?= 0
105*d95af8dfSAndroid Build Coastguard WorkerRUN_TESTS ?= 1
106*d95af8dfSAndroid Build Coastguard WorkerARCH ?= $(shell uname -m)
107*d95af8dfSAndroid Build Coastguard Worker
108*d95af8dfSAndroid Build Coastguard Worker# Put objects in a separate tree based on makefile locations
109*d95af8dfSAndroid Build Coastguard Worker# This means you can build a tree without touching it:
110*d95af8dfSAndroid Build Coastguard Worker#   make -C $SRCDIR  # will create ./build-$(MODE)
111*d95af8dfSAndroid Build Coastguard Worker# Or
112*d95af8dfSAndroid Build Coastguard Worker#   make -C $SRCDIR OUT=$PWD
113*d95af8dfSAndroid Build Coastguard Worker# This variable is extended on subdir calls and doesn't need to be re-called.
114*d95af8dfSAndroid Build Coastguard WorkerOUT ?= $(PWD)/
115*d95af8dfSAndroid Build Coastguard Worker
116*d95af8dfSAndroid Build Coastguard Worker# Make OUT now so we can use realpath.
117*d95af8dfSAndroid Build Coastguard Worker$(shell mkdir -p "$(OUT)")
118*d95af8dfSAndroid Build Coastguard Worker
119*d95af8dfSAndroid Build Coastguard Worker# TODO(wad) Relative paths are resolved against SRC and not the calling dir.
120*d95af8dfSAndroid Build Coastguard Worker# Ensure a command-line supplied OUT has a slash
121*d95af8dfSAndroid Build Coastguard Workeroverride OUT := $(realpath $(OUT))/
122*d95af8dfSAndroid Build Coastguard Worker
123*d95af8dfSAndroid Build Coastguard Worker# SRC is not meant to be set by the end user, but during make call relocation.
124*d95af8dfSAndroid Build Coastguard Worker# $(PWD) != $(CURDIR) all the time.
125*d95af8dfSAndroid Build Coastguard Workerexport SRC ?= $(CURDIR)
126*d95af8dfSAndroid Build Coastguard Worker
127*d95af8dfSAndroid Build Coastguard Worker# Re-start in the $(OUT) directory if we're not there.
128*d95af8dfSAndroid Build Coastguard Worker# We may be invoked using -C or bare and we need to ensure behavior
129*d95af8dfSAndroid Build Coastguard Worker# is consistent so we check both PWD vs OUT and PWD vs CURDIR.
130*d95af8dfSAndroid Build Coastguard Workeroverride RELOCATE_BUILD := 0
131*d95af8dfSAndroid Build Coastguard Workerifneq (${PWD}/,${OUT})
132*d95af8dfSAndroid Build Coastguard Workeroverride RELOCATE_BUILD := 1
133*d95af8dfSAndroid Build Coastguard Workerendif
134*d95af8dfSAndroid Build Coastguard Worker# Make sure we're running with no builtin targets. They cause
135*d95af8dfSAndroid Build Coastguard Worker# leakage and mayhem!
136*d95af8dfSAndroid Build Coastguard Workerifneq (${PWD},${CURDIR})
137*d95af8dfSAndroid Build Coastguard Workeroverride RELOCATE_BUILD := 1
138*d95af8dfSAndroid Build Coastguard Worker# If we're run from the build dir, don't let it get cleaned up later.
139*d95af8dfSAndroid Build Coastguard Workerifeq (${PWD}/,${OUT})
140*d95af8dfSAndroid Build Coastguard Worker$(shell touch "$(PWD)/.dont_delete_on_clean")
141*d95af8dfSAndroid Build Coastguard Workerendif
142*d95af8dfSAndroid Build Coastguard Workerendif  # ifneq (${PWD},${CURDIR}
143*d95af8dfSAndroid Build Coastguard Worker
144*d95af8dfSAndroid Build Coastguard Worker# "Relocate" if we need to restart without implicit rules.
145*d95af8dfSAndroid Build Coastguard Workerifeq ($(subst r,,$(MAKEFLAGS)),$(MAKEFLAGS))
146*d95af8dfSAndroid Build Coastguard Workeroverride RELOCATE_BUILD := 1
147*d95af8dfSAndroid Build Coastguard Workerendif
148*d95af8dfSAndroid Build Coastguard Worker
149*d95af8dfSAndroid Build Coastguard Workerifeq (${RELOCATE_BUILD},1)
150*d95af8dfSAndroid Build Coastguard Worker# By default, silence build output. Reused below as well.
151*d95af8dfSAndroid Build Coastguard WorkerQUIET = @
152*d95af8dfSAndroid Build Coastguard Workerifeq ($(VERBOSE),1)
153*d95af8dfSAndroid Build Coastguard Worker  QUIET=
154*d95af8dfSAndroid Build Coastguard Workerendif
155*d95af8dfSAndroid Build Coastguard Worker
156*d95af8dfSAndroid Build Coastguard Worker# This target will override all targets, including prerequisites. To avoid
157*d95af8dfSAndroid Build Coastguard Worker# calling $(MAKE) once per prereq on the given CMDGOAL, we guard it with a local
158*d95af8dfSAndroid Build Coastguard Worker# variable.
159*d95af8dfSAndroid Build Coastguard WorkerRUN_ONCE := 0
160*d95af8dfSAndroid Build Coastguard WorkerMAKECMDGOALS ?= all
161*d95af8dfSAndroid Build Coastguard Worker# Keep the rules split as newer make does not allow them to be declared
162*d95af8dfSAndroid Build Coastguard Worker# on the same line.  But the way :: rules work, the _all here will also
163*d95af8dfSAndroid Build Coastguard Worker# invoke the %:: rule while retaining "_all" as the default.
164*d95af8dfSAndroid Build Coastguard Worker_all::
165*d95af8dfSAndroid Build Coastguard Worker%::
166*d95af8dfSAndroid Build Coastguard Worker	$(if $(filter 0,$(RUN_ONCE)), \
167*d95af8dfSAndroid Build Coastguard Worker	  cd "$(OUT)" && \
168*d95af8dfSAndroid Build Coastguard Worker	  $(MAKE) -r -I "$(SRC)" -f "$(CURDIR)/Makefile" \
169*d95af8dfSAndroid Build Coastguard Worker	    SRC="$(CURDIR)" OUT="$(OUT)" $(foreach g,$(MAKECMDGOALS),"$(g)"),)
170*d95af8dfSAndroid Build Coastguard Worker	$(eval RUN_ONCE := 1)
171*d95af8dfSAndroid Build Coastguard Workerpass-to-subcall := 1
172*d95af8dfSAndroid Build Coastguard Workerendif
173*d95af8dfSAndroid Build Coastguard Worker
174*d95af8dfSAndroid Build Coastguard Workerifeq ($(pass-to-subcall),)
175*d95af8dfSAndroid Build Coastguard Worker
176*d95af8dfSAndroid Build Coastguard Worker# Only call MODULE if we're in a submodule
177*d95af8dfSAndroid Build Coastguard WorkerMODULES_LIST := $(filter-out Makefile %.d,$(MAKEFILE_LIST))
178*d95af8dfSAndroid Build Coastguard Workerifeq ($(words $(filter-out Makefile common.mk %.d $(SRC)/Makefile \
179*d95af8dfSAndroid Build Coastguard Worker                           $(SRC)/common.mk,$(MAKEFILE_LIST))),0)
180*d95af8dfSAndroid Build Coastguard Worker
181*d95af8dfSAndroid Build Coastguard Worker# All the top-level defines outside of module.mk.
182*d95af8dfSAndroid Build Coastguard Worker
183*d95af8dfSAndroid Build Coastguard Worker#
184*d95af8dfSAndroid Build Coastguard Worker# Helper macros
185*d95af8dfSAndroid Build Coastguard Worker#
186*d95af8dfSAndroid Build Coastguard Worker
187*d95af8dfSAndroid Build Coastguard Worker# Create the directory if it doesn't yet exist.
188*d95af8dfSAndroid Build Coastguard Workerdefine auto_mkdir
189*d95af8dfSAndroid Build Coastguard Worker  $(if $(wildcard $(dir $1)),$2,$(QUIET)mkdir -p "$(dir $1)")
190*d95af8dfSAndroid Build Coastguard Workerendef
191*d95af8dfSAndroid Build Coastguard Worker
192*d95af8dfSAndroid Build Coastguard Worker# Creates the actual archive with an index.
193*d95af8dfSAndroid Build Coastguard Worker# The target $@ must end with .pic.a or .pie.a.
194*d95af8dfSAndroid Build Coastguard Workerdefine update_archive
195*d95af8dfSAndroid Build Coastguard Worker  $(call auto_mkdir,$(TARGET_OR_MEMBER))
196*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# Create the archive in one step to avoid parallel use accessing it
197*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# before all the symbols are present.
198*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "AR		$(subst \
199*d95af8dfSAndroid Build Coastguard Worker$(SRC)/,,$(^:.o=$(suffix $(basename $(TARGET_OR_MEMBER))).o)) \
200*d95af8dfSAndroid Build Coastguard Worker-> $(subst $(SRC)/,,$(TARGET_OR_MEMBER))"
201*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$(AR) rcs $(TARGET_OR_MEMBER) \
202*d95af8dfSAndroid Build Coastguard Worker          $(subst $(SRC)/,,$(^:.o=$(suffix $(basename $(TARGET_OR_MEMBER))).o))
203*d95af8dfSAndroid Build Coastguard Workerendef
204*d95af8dfSAndroid Build Coastguard Worker
205*d95af8dfSAndroid Build Coastguard Worker# Default compile from objects using pre-requisites but filters out
206*d95af8dfSAndroid Build Coastguard Worker# subdirs and .d files.
207*d95af8dfSAndroid Build Coastguard Workerdefine cc_binary
208*d95af8dfSAndroid Build Coastguard Worker  $(call COMPILE_BINARY_implementation,CC,$(CFLAGS) $(1),$(EXTRA_FLAGS))
209*d95af8dfSAndroid Build Coastguard Workerendef
210*d95af8dfSAndroid Build Coastguard Worker
211*d95af8dfSAndroid Build Coastguard Workerdefine cxx_binary
212*d95af8dfSAndroid Build Coastguard Worker  $(call COMPILE_BINARY_implementation,CXX,$(CXXFLAGS) $(1),$(EXTRA_FLAGS))
213*d95af8dfSAndroid Build Coastguard Workerendef
214*d95af8dfSAndroid Build Coastguard Worker
215*d95af8dfSAndroid Build Coastguard Worker# Default compile from objects using pre-requisites but filters out
216*d95af8dfSAndroid Build Coastguard Worker# subdirs and .d files.
217*d95af8dfSAndroid Build Coastguard Workerdefine cc_library
218*d95af8dfSAndroid Build Coastguard Worker  $(call COMPILE_LIBRARY_implementation,CC,$(CFLAGS) $(1),$(EXTRA_FLAGS))
219*d95af8dfSAndroid Build Coastguard Workerendef
220*d95af8dfSAndroid Build Coastguard Workerdefine cxx_library
221*d95af8dfSAndroid Build Coastguard Worker  $(call COMPILE_LIBRARY_implementation,CXX,$(CXXFLAGS) $(1),$(EXTRA_FLAGS))
222*d95af8dfSAndroid Build Coastguard Workerendef
223*d95af8dfSAndroid Build Coastguard Worker
224*d95af8dfSAndroid Build Coastguard Worker# Deletes files silently if they exist. Meant for use in any local
225*d95af8dfSAndroid Build Coastguard Worker# clean targets.
226*d95af8dfSAndroid Build Coastguard Workerdefine silent_rm
227*d95af8dfSAndroid Build Coastguard Worker  $(if $(wildcard $(1)),
228*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)($(ECHO) -n '$(COLOR_RED)CLEANFILE$(COLOR_RESET)		' && \
229*d95af8dfSAndroid Build Coastguard Worker    $(ECHO) '$(subst $(OUT)/,,$(wildcard $(1)))' && \
230*d95af8dfSAndroid Build Coastguard Worker    $(RM) $(1) 2>/dev/null) || true,)
231*d95af8dfSAndroid Build Coastguard Workerendef
232*d95af8dfSAndroid Build Coastguard Workerdefine silent_rmdir
233*d95af8dfSAndroid Build Coastguard Worker  $(if $(wildcard $(1)),
234*d95af8dfSAndroid Build Coastguard Worker    $(if $(wildcard $(1)/*),
235*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# $(1) not empty [$(wildcard $(1)/*)]. Not deleting.,
236*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)($(ECHO) -n '$(COLOR_RED)CLEANDIR$(COLOR_RESET)		' && \
237*d95af8dfSAndroid Build Coastguard Worker    $(ECHO) '$(subst $(OUT)/,,$(wildcard $(1)))' && \
238*d95af8dfSAndroid Build Coastguard Worker    $(RMDIR) $(1) 2>/dev/null) || true),)
239*d95af8dfSAndroid Build Coastguard Workerendef
240*d95af8dfSAndroid Build Coastguard Worker
241*d95af8dfSAndroid Build Coastguard Worker#
242*d95af8dfSAndroid Build Coastguard Worker# Default variable values
243*d95af8dfSAndroid Build Coastguard Worker#
244*d95af8dfSAndroid Build Coastguard Worker
245*d95af8dfSAndroid Build Coastguard Worker# Only override toolchain vars if they are from make.
246*d95af8dfSAndroid Build Coastguard WorkerCROSS_COMPILE ?=
247*d95af8dfSAndroid Build Coastguard Workerdefine override_var
248*d95af8dfSAndroid Build Coastguard Workerifneq ($(filter undefined default,$(origin $1)),)
249*d95af8dfSAndroid Build Coastguard Worker$1 = $(CROSS_COMPILE)$2
250*d95af8dfSAndroid Build Coastguard Workerendif
251*d95af8dfSAndroid Build Coastguard Workerendef
252*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,AR,ar))
253*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,CC,gcc))
254*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,CXX,g++))
255*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,OBJCOPY,objcopy))
256*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,PKG_CONFIG,pkg-config))
257*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,RANLIB,ranlib))
258*d95af8dfSAndroid Build Coastguard Worker$(eval $(call override_var,STRIP,strip))
259*d95af8dfSAndroid Build Coastguard Worker
260*d95af8dfSAndroid Build Coastguard WorkerRMDIR ?= rmdir
261*d95af8dfSAndroid Build Coastguard WorkerECHO = /bin/echo -e
262*d95af8dfSAndroid Build Coastguard Worker
263*d95af8dfSAndroid Build Coastguard Workerifeq ($(filter clang,$(subst -, ,$(notdir $(CC)))),clang)
264*d95af8dfSAndroid Build Coastguard WorkerCDRIVER = clang
265*d95af8dfSAndroid Build Coastguard Workerelse
266*d95af8dfSAndroid Build Coastguard WorkerCDRIVER = gcc
267*d95af8dfSAndroid Build Coastguard Workerendif
268*d95af8dfSAndroid Build Coastguard Worker
269*d95af8dfSAndroid Build Coastguard Workerifeq ($(filter clang++,$(subst -, ,$(notdir $(CXX)))),clang++)
270*d95af8dfSAndroid Build Coastguard WorkerCXXDRIVER = clang
271*d95af8dfSAndroid Build Coastguard Workerelse
272*d95af8dfSAndroid Build Coastguard WorkerCXXDRIVER = gcc
273*d95af8dfSAndroid Build Coastguard Workerendif
274*d95af8dfSAndroid Build Coastguard Worker
275*d95af8dfSAndroid Build Coastguard Worker# Internal macro to support check_XXX macros below.
276*d95af8dfSAndroid Build Coastguard Worker# Usage: $(call check_compile, [code], [compiler], [code_type], [c_flags],
277*d95af8dfSAndroid Build Coastguard Worker#               [extra_c_flags], [library_flags], [success_ret], [fail_ret])
278*d95af8dfSAndroid Build Coastguard Worker# Return: [success_ret] if compile succeeded, otherwise [fail_ret]
279*d95af8dfSAndroid Build Coastguard Workercheck_compile = $(shell printf '%b\n' $(1) | \
280*d95af8dfSAndroid Build Coastguard Worker  $($(2)) $($(4)) -x $(3) $(LDFLAGS) $(5) - $(6) -o /dev/null > /dev/null 2>&1 \
281*d95af8dfSAndroid Build Coastguard Worker  && echo "$(7)" || echo "$(8)")
282*d95af8dfSAndroid Build Coastguard Worker
283*d95af8dfSAndroid Build Coastguard Worker# Helper macro to check whether a test program will compile with the specified
284*d95af8dfSAndroid Build Coastguard Worker# compiler flags.
285*d95af8dfSAndroid Build Coastguard Worker# Usage: $(call check_compile_cc, [code], [flags], [alternate_flags])
286*d95af8dfSAndroid Build Coastguard Worker# Return: [flags] if compile succeeded, otherwise [alternate_flags]
287*d95af8dfSAndroid Build Coastguard Workercheck_compile_cc = $(call check_compile,$(1),CC,c,CFLAGS,$(2),,$(2),$(3))
288*d95af8dfSAndroid Build Coastguard Workercheck_compile_cxx = $(call check_compile,$(1),CXX,c++,CXXFLAGS,$(2),,$(2),$(3))
289*d95af8dfSAndroid Build Coastguard Worker
290*d95af8dfSAndroid Build Coastguard Worker# Helper macro to check whether a test program will compile with the specified
291*d95af8dfSAndroid Build Coastguard Worker# libraries.
292*d95af8dfSAndroid Build Coastguard Worker# Usage: $(call check_compile_cc, [code], [library_flags], [alternate_flags])
293*d95af8dfSAndroid Build Coastguard Worker# Return: [library_flags] if compile succeeded, otherwise [alternate_flags]
294*d95af8dfSAndroid Build Coastguard Workercheck_libs_cc = $(call check_compile,$(1),CC,c,CFLAGS,,$(2),$(2),$(3))
295*d95af8dfSAndroid Build Coastguard Workercheck_libs_cxx = $(call check_compile,$(1),CXX,c++,CXXFLAGS,,$(2),$(2),$(3))
296*d95af8dfSAndroid Build Coastguard Worker
297*d95af8dfSAndroid Build Coastguard Worker# Helper macro to check whether the compiler accepts the specified flags.
298*d95af8dfSAndroid Build Coastguard Worker# Usage: $(call check_compile_cc, [flags], [alternate_flags])
299*d95af8dfSAndroid Build Coastguard Worker# Return: [flags] if compile succeeded, otherwise [alternate_flags]
300*d95af8dfSAndroid Build Coastguard Workercheck_cc = $(call check_compile_cc,'int main() { return 0; }',$(1),$(2))
301*d95af8dfSAndroid Build Coastguard Workercheck_cxx = $(call check_compile_cxx,'int main() { return 0; }',$(1),$(2))
302*d95af8dfSAndroid Build Coastguard Worker
303*d95af8dfSAndroid Build Coastguard Worker# Choose the stack protector flags based on whats supported by the compiler.
304*d95af8dfSAndroid Build Coastguard WorkerSSP_CFLAGS := $(call check_cc,-fstack-protector-strong)
305*d95af8dfSAndroid Build Coastguard Workerifeq ($(SSP_CFLAGS),)
306*d95af8dfSAndroid Build Coastguard Worker SSP_CFLAGS := $(call check_cc,-fstack-protector-all)
307*d95af8dfSAndroid Build Coastguard Workerendif
308*d95af8dfSAndroid Build Coastguard Worker
309*d95af8dfSAndroid Build Coastguard Worker# To update these from an including Makefile:
310*d95af8dfSAndroid Build Coastguard Worker#  CXXFLAGS += -mahflag  # Append to the list
311*d95af8dfSAndroid Build Coastguard Worker#  CXXFLAGS := -mahflag $(CXXFLAGS) # Prepend to the list
312*d95af8dfSAndroid Build Coastguard Worker#  CXXFLAGS := $(filter-out badflag,$(CXXFLAGS)) # Filter out a value
313*d95af8dfSAndroid Build Coastguard Worker# The same goes for CFLAGS.
314*d95af8dfSAndroid Build Coastguard WorkerCOMMON_CFLAGS-gcc := -fvisibility=internal -ggdb3 -Wa,--noexecstack
315*d95af8dfSAndroid Build Coastguard Worker# minigbm: Disable -Wimplicit-fallthrough to unbreak compilation.
316*d95af8dfSAndroid Build Coastguard WorkerCOMMON_CFLAGS-clang := -fvisibility=hidden -ggdb \
317*d95af8dfSAndroid Build Coastguard Worker  -Wstring-plus-int
318*d95af8dfSAndroid Build Coastguard Worker# When a class is exported through __attribute__((visibility("default"))), we
319*d95af8dfSAndroid Build Coastguard Worker# still want to eliminate symbols from inline class member functions to reduce
320*d95af8dfSAndroid Build Coastguard Worker# symbol resolution overhead. Therefore, pass -fvisibility-inlines-hidden in
321*d95af8dfSAndroid Build Coastguard Worker# addition to -fvisibility=hidden. (go/cros-symbol-slimming)
322*d95af8dfSAndroid Build Coastguard Worker# minigbm: Disable -Wunreachable-code to unbreak compilation.
323*d95af8dfSAndroid Build Coastguard WorkerCOMMON_CFLAGS := -Wall -Wunused -Wno-unused-parameter \
324*d95af8dfSAndroid Build Coastguard Worker  -Wbool-operation -Wstring-compare -Wxor-used-as-pow \
325*d95af8dfSAndroid Build Coastguard Worker  -Wint-in-bool-context -Wfree-nonheap-object \
326*d95af8dfSAndroid Build Coastguard Worker  -Werror -Wformat=2 -fno-strict-aliasing  \
327*d95af8dfSAndroid Build Coastguard Worker  $(SSP_CFLAGS) -O1
328*d95af8dfSAndroid Build Coastguard WorkerCXXFLAGS += $(COMMON_CFLAGS) $(COMMON_CFLAGS-$(CXXDRIVER)) -std=gnu++20 \
329*d95af8dfSAndroid Build Coastguard Worker  -fvisibility-inlines-hidden
330*d95af8dfSAndroid Build Coastguard WorkerCFLAGS += $(COMMON_CFLAGS) $(COMMON_CFLAGS-$(CDRIVER)) -std=gnu17
331*d95af8dfSAndroid Build Coastguard Worker# We undefine _FORTIFY_SOURCE because some distros enable it by default in
332*d95af8dfSAndroid Build Coastguard Worker# their toolchains.  This makes the compiler issue warnings about redefines
333*d95af8dfSAndroid Build Coastguard Worker# and our -Werror usage breaks it all.
334*d95af8dfSAndroid Build Coastguard WorkerCPPFLAGS += -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=3
335*d95af8dfSAndroid Build Coastguard Worker
336*d95af8dfSAndroid Build Coastguard Worker# Enable large file support.
337*d95af8dfSAndroid Build Coastguard WorkerCPPFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE
338*d95af8dfSAndroid Build Coastguard Worker
339*d95af8dfSAndroid Build Coastguard Worker# Disable exceptions based on the CXXEXCEPTIONS setting.
340*d95af8dfSAndroid Build Coastguard Workerifeq ($(CXXEXCEPTIONS),0)
341*d95af8dfSAndroid Build Coastguard Worker  CXXFLAGS := $(CXXFLAGS) -fno-exceptions -fno-unwind-tables \
342*d95af8dfSAndroid Build Coastguard Worker    -fno-asynchronous-unwind-tables
343*d95af8dfSAndroid Build Coastguard Workerendif
344*d95af8dfSAndroid Build Coastguard Worker
345*d95af8dfSAndroid Build Coastguard Workerifeq ($(MODE),opt)
346*d95af8dfSAndroid Build Coastguard Worker  # Up the optimizations.
347*d95af8dfSAndroid Build Coastguard Worker  CFLAGS := $(filter-out -O1,$(CFLAGS)) -O2
348*d95af8dfSAndroid Build Coastguard Worker  CXXFLAGS := $(filter-out -O1,$(CXXFLAGS)) -O2
349*d95af8dfSAndroid Build Coastguard Worker  # Only drop -g* if symbols aren't desired.
350*d95af8dfSAndroid Build Coastguard Worker  ifeq ($(NOSTRIP),0)
351*d95af8dfSAndroid Build Coastguard Worker    # TODO: do we want -fomit-frame-pointer on x86?
352*d95af8dfSAndroid Build Coastguard Worker    CFLAGS := $(filter-out -ggdb3,$(CFLAGS))
353*d95af8dfSAndroid Build Coastguard Worker    CXXFLAGS := $(filter-out -ggdb3,$(CXXFLAGS))
354*d95af8dfSAndroid Build Coastguard Worker  endif
355*d95af8dfSAndroid Build Coastguard Workerendif
356*d95af8dfSAndroid Build Coastguard Worker
357*d95af8dfSAndroid Build Coastguard Workerifeq ($(MODE),profiling)
358*d95af8dfSAndroid Build Coastguard Worker  CFLAGS := $(CFLAGS) -O0 -g  --coverage
359*d95af8dfSAndroid Build Coastguard Worker  CXXFLAGS := $(CXXFLAGS) -O0 -g  --coverage
360*d95af8dfSAndroid Build Coastguard Worker  LDFLAGS := $(LDFLAGS) --coverage
361*d95af8dfSAndroid Build Coastguard Workerendif
362*d95af8dfSAndroid Build Coastguard Worker
363*d95af8dfSAndroid Build Coastguard Worker# Pass -Bsymbolic-non-weak which pre-binds symbols in the same DSO to improve
364*d95af8dfSAndroid Build Coastguard Worker# startup performance. We don't support interposing non-weak symbols.
365*d95af8dfSAndroid Build Coastguard Worker# (go/cros-symbol-slimming)
366*d95af8dfSAndroid Build Coastguard WorkerLDFLAGS := $(LDFLAGS) \
367*d95af8dfSAndroid Build Coastguard Worker  -z relro \
368*d95af8dfSAndroid Build Coastguard Worker  -z noexecstack \
369*d95af8dfSAndroid Build Coastguard Worker  -z now \
370*d95af8dfSAndroid Build Coastguard Worker  $(call check_cc,-Xlinker -Bsymbolic-non-weak)
371*d95af8dfSAndroid Build Coastguard Worker
372*d95af8dfSAndroid Build Coastguard Worker# Fancy helpers for color if a prompt is defined
373*d95af8dfSAndroid Build Coastguard Workerifeq ($(COLOR),1)
374*d95af8dfSAndroid Build Coastguard WorkerCOLOR_RESET = \x1b[0m
375*d95af8dfSAndroid Build Coastguard WorkerCOLOR_GREEN = \x1b[32;01m
376*d95af8dfSAndroid Build Coastguard WorkerCOLOR_RED = \x1b[31;01m
377*d95af8dfSAndroid Build Coastguard WorkerCOLOR_YELLOW = \x1b[33;01m
378*d95af8dfSAndroid Build Coastguard Workerendif
379*d95af8dfSAndroid Build Coastguard Worker
380*d95af8dfSAndroid Build Coastguard Worker# By default, silence build output.
381*d95af8dfSAndroid Build Coastguard WorkerQUIET = @
382*d95af8dfSAndroid Build Coastguard Workerifeq ($(VERBOSE),1)
383*d95af8dfSAndroid Build Coastguard Worker  QUIET=
384*d95af8dfSAndroid Build Coastguard Workerendif
385*d95af8dfSAndroid Build Coastguard Worker
386*d95af8dfSAndroid Build Coastguard Worker#
387*d95af8dfSAndroid Build Coastguard Worker# Implementation macros for compile helpers above
388*d95af8dfSAndroid Build Coastguard Worker#
389*d95af8dfSAndroid Build Coastguard Worker
390*d95af8dfSAndroid Build Coastguard Worker# Useful for dealing with pie-broken toolchains.
391*d95af8dfSAndroid Build Coastguard Worker# Call make with PIE=0 to disable default PIE use.
392*d95af8dfSAndroid Build Coastguard WorkerOBJ_PIE_FLAG = -fPIE
393*d95af8dfSAndroid Build Coastguard WorkerCOMPILE_PIE_FLAG = -pie
394*d95af8dfSAndroid Build Coastguard Workerifeq ($(PIE),0)
395*d95af8dfSAndroid Build Coastguard Worker  OBJ_PIE_FLAG =
396*d95af8dfSAndroid Build Coastguard Worker  COMPILE_PIE_FLAG =
397*d95af8dfSAndroid Build Coastguard Workerendif
398*d95af8dfSAndroid Build Coastguard Worker
399*d95af8dfSAndroid Build Coastguard Worker# Favor member targets first for CXX_BINARY(%) magic.
400*d95af8dfSAndroid Build Coastguard Worker# And strip out nested members if possible.
401*d95af8dfSAndroid Build Coastguard WorkerLP := (
402*d95af8dfSAndroid Build Coastguard WorkerRP := )
403*d95af8dfSAndroid Build Coastguard WorkerTARGET_OR_MEMBER = $(lastword $(subst $(LP), ,$(subst $(RP),,$(or $%,$@))))
404*d95af8dfSAndroid Build Coastguard Worker
405*d95af8dfSAndroid Build Coastguard Worker# Default compile from objects using pre-requisites but filters out
406*d95af8dfSAndroid Build Coastguard Worker# all non-.o files.
407*d95af8dfSAndroid Build Coastguard Workerdefine COMPILE_BINARY_implementation
408*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "LD$(1)		$(subst $(PWD)/,,$(TARGET_OR_MEMBER))"
409*d95af8dfSAndroid Build Coastguard Worker  $(call auto_mkdir,$(TARGET_OR_MEMBER))
410*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$($(1)) $(COMPILE_PIE_FLAGS) -o $(TARGET_OR_MEMBER) \
411*d95af8dfSAndroid Build Coastguard Worker    $(2) $(LDFLAGS) \
412*d95af8dfSAndroid Build Coastguard Worker    $(filter %.o %.a,$(^:.o=.pie.o)) \
413*d95af8dfSAndroid Build Coastguard Worker    $(foreach so,$(filter %.so,$^),-L$(dir $(so)) \
414*d95af8dfSAndroid Build Coastguard Worker                            -l$(patsubst lib%,%,$(basename $(notdir $(so))))) \
415*d95af8dfSAndroid Build Coastguard Worker    $(LDLIBS)
416*d95af8dfSAndroid Build Coastguard Worker  $(call conditional_strip)
417*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) -n "BIN		"
418*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "$(COLOR_GREEN)$(subst $(PWD)/,,$(TARGET_OR_MEMBER))$(COLOR_RESET)"
419*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "	$(COLOR_YELLOW)-----$(COLOR_RESET)"
420*d95af8dfSAndroid Build Coastguard Workerendef
421*d95af8dfSAndroid Build Coastguard Worker
422*d95af8dfSAndroid Build Coastguard Worker# TODO: add version support extracted from PV environment variable
423*d95af8dfSAndroid Build Coastguard Worker#ifeq ($(PV),9999)
424*d95af8dfSAndroid Build Coastguard Worker#$(warning PV=$(PV). If shared object versions matter, please force PV=.)
425*d95af8dfSAndroid Build Coastguard Worker#endif
426*d95af8dfSAndroid Build Coastguard Worker# Then add -Wl,-soname,$@.$(PV) ?
427*d95af8dfSAndroid Build Coastguard Worker
428*d95af8dfSAndroid Build Coastguard Worker# Default compile from objects using pre-requisites but filters out
429*d95af8dfSAndroid Build Coastguard Worker# all non-.o values. (Remember to add -L$(OUT) -llib)
430*d95af8dfSAndroid Build Coastguard WorkerCOMMA := ,
431*d95af8dfSAndroid Build Coastguard Workerdefine COMPILE_LIBRARY_implementation
432*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "SHARED$(1)	$(subst $(PWD)/,,$(TARGET_OR_MEMBER))"
433*d95af8dfSAndroid Build Coastguard Worker  $(call auto_mkdir,$(TARGET_OR_MEMBER))
434*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$($(1)) -shared -Wl,-E -o $(TARGET_OR_MEMBER) \
435*d95af8dfSAndroid Build Coastguard Worker    $(2) $(LDFLAGS) \
436*d95af8dfSAndroid Build Coastguard Worker    $(if $(filter %.a,$^),-Wl$(COMMA)--whole-archive,) \
437*d95af8dfSAndroid Build Coastguard Worker    $(filter %.o ,$(^:.o=.pic.o)) \
438*d95af8dfSAndroid Build Coastguard Worker    $(foreach a,$(filter %.a,$^),-L$(dir $(a)) \
439*d95af8dfSAndroid Build Coastguard Worker                            -l$(patsubst lib%,%,$(basename $(notdir $(a))))) \
440*d95af8dfSAndroid Build Coastguard Worker    $(foreach so,$(filter %.so,$^),-L$(dir $(so)) \
441*d95af8dfSAndroid Build Coastguard Worker                            -l$(patsubst lib%,%,$(basename $(notdir $(so))))) \
442*d95af8dfSAndroid Build Coastguard Worker    $(LDLIBS)
443*d95af8dfSAndroid Build Coastguard Worker  $(call conditional_strip)
444*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) -n "LIB		$(COLOR_GREEN)"
445*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "$(subst $(PWD)/,,$(TARGET_OR_MEMBER))$(COLOR_RESET)"
446*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "	$(COLOR_YELLOW)-----$(COLOR_RESET)"
447*d95af8dfSAndroid Build Coastguard Workerendef
448*d95af8dfSAndroid Build Coastguard Worker
449*d95af8dfSAndroid Build Coastguard Workerdefine conditional_strip
450*d95af8dfSAndroid Build Coastguard Worker  $(if $(filter 0,$(NOSTRIP)),$(call strip_artifact))
451*d95af8dfSAndroid Build Coastguard Workerendef
452*d95af8dfSAndroid Build Coastguard Worker
453*d95af8dfSAndroid Build Coastguard Workerdefine strip_artifact
454*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "STRIP		$(subst $(OUT)/,,$(TARGET_OR_MEMBER))"
455*d95af8dfSAndroid Build Coastguard Worker  $(if $(filter 1,$(SPLITDEBUG)), @$(ECHO) -n "DEBUG	"; \
456*d95af8dfSAndroid Build Coastguard Worker    $(ECHO) "$(COLOR_YELLOW)\
457*d95af8dfSAndroid Build Coastguard Worker$(subst $(OUT)/,,$(TARGET_OR_MEMBER)).debug$(COLOR_RESET)")
458*d95af8dfSAndroid Build Coastguard Worker  $(if $(filter 1,$(SPLITDEBUG)), \
459*d95af8dfSAndroid Build Coastguard Worker    $(QUIET)$(OBJCOPY) --only-keep-debug "$(TARGET_OR_MEMBER)" \
460*d95af8dfSAndroid Build Coastguard Worker      "$(TARGET_OR_MEMBER).debug")
461*d95af8dfSAndroid Build Coastguard Worker  $(if $(filter-out dbg,$(MODE)),$(QUIET)$(STRIP) --strip-unneeded \
462*d95af8dfSAndroid Build Coastguard Worker    "$(TARGET_OR_MEMBER)",)
463*d95af8dfSAndroid Build Coastguard Workerendef
464*d95af8dfSAndroid Build Coastguard Worker
465*d95af8dfSAndroid Build Coastguard Worker#
466*d95af8dfSAndroid Build Coastguard Worker# Global pattern rules
467*d95af8dfSAndroid Build Coastguard Worker#
468*d95af8dfSAndroid Build Coastguard Worker
469*d95af8dfSAndroid Build Coastguard Worker# Below, the archive member syntax is abused to create fancier
470*d95af8dfSAndroid Build Coastguard Worker# syntactic sugar for recipe authors that avoids needed to know
471*d95af8dfSAndroid Build Coastguard Worker# subcall options.  The downside is that make attempts to look
472*d95af8dfSAndroid Build Coastguard Worker# into the phony archives for timestamps. This will cause the final
473*d95af8dfSAndroid Build Coastguard Worker# target to be rebuilt/linked on _every_ call to make even when nothing
474*d95af8dfSAndroid Build Coastguard Worker# has changed.  Until a better way presents itself, we have helpers that
475*d95af8dfSAndroid Build Coastguard Worker# do the stat check on make's behalf.  Dodgy but simple.
476*d95af8dfSAndroid Build Coastguard Workerdefine old_or_no_timestamp
477*d95af8dfSAndroid Build Coastguard Worker  $(if $(realpath $%),,$(1))
478*d95af8dfSAndroid Build Coastguard Worker  $(if $(shell find $^ -cnewer "$%" 2>/dev/null),$(1))
479*d95af8dfSAndroid Build Coastguard Workerendef
480*d95af8dfSAndroid Build Coastguard Worker
481*d95af8dfSAndroid Build Coastguard Workerdefine check_deps
482*d95af8dfSAndroid Build Coastguard Worker  $(if $(filter 0,$(words $^)),\
483*d95af8dfSAndroid Build Coastguard Worker    $(error Missing dependencies or declaration of $@($%)),)
484*d95af8dfSAndroid Build Coastguard Workerendef
485*d95af8dfSAndroid Build Coastguard Worker
486*d95af8dfSAndroid Build Coastguard Worker# Build a cxx target magically
487*d95af8dfSAndroid Build Coastguard WorkerCXX_BINARY(%):
488*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
489*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cxx_binary))
490*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CXX_BINARY*)
491*d95af8dfSAndroid Build Coastguard Worker
492*d95af8dfSAndroid Build Coastguard WorkerCC_BINARY(%):
493*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
494*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cc_binary))
495*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CC_BINARY*)
496*d95af8dfSAndroid Build Coastguard Worker
497*d95af8dfSAndroid Build Coastguard WorkerCXX_STATIC_BINARY(%):
498*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
499*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cxx_binary,-static))
500*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CXX_STATIC_BINARY*)
501*d95af8dfSAndroid Build Coastguard Worker
502*d95af8dfSAndroid Build Coastguard WorkerCC_STATIC_BINARY(%):
503*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
504*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cc_binary,-static))
505*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CC_STATIC_BINARY*)
506*d95af8dfSAndroid Build Coastguard Worker
507*d95af8dfSAndroid Build Coastguard WorkerCXX_LIBRARY(%):
508*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
509*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cxx_library))
510*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CXX_LIBRARY*)
511*d95af8dfSAndroid Build Coastguard Worker
512*d95af8dfSAndroid Build Coastguard WorkerCXX_LIBARY(%):
513*d95af8dfSAndroid Build Coastguard Worker	$(error Typo alert! LIBARY != LIBRARY)
514*d95af8dfSAndroid Build Coastguard Worker
515*d95af8dfSAndroid Build Coastguard WorkerCC_LIBRARY(%):
516*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
517*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call cc_library))
518*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CC_LIBRARY*)
519*d95af8dfSAndroid Build Coastguard Worker
520*d95af8dfSAndroid Build Coastguard WorkerCC_LIBARY(%):
521*d95af8dfSAndroid Build Coastguard Worker	$(error Typo alert! LIBARY != LIBRARY)
522*d95af8dfSAndroid Build Coastguard Worker
523*d95af8dfSAndroid Build Coastguard WorkerCXX_STATIC_LIBRARY(%):
524*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
525*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call update_archive))
526*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CXX_STATIC_LIBRARY*)
527*d95af8dfSAndroid Build Coastguard Worker
528*d95af8dfSAndroid Build Coastguard WorkerCXX_STATIC_LIBARY(%):
529*d95af8dfSAndroid Build Coastguard Worker	$(error Typo alert! LIBARY != LIBRARY)
530*d95af8dfSAndroid Build Coastguard Worker
531*d95af8dfSAndroid Build Coastguard WorkerCC_STATIC_LIBRARY(%):
532*d95af8dfSAndroid Build Coastguard Worker	$(call check_deps)
533*d95af8dfSAndroid Build Coastguard Worker	$(call old_or_no_timestamp,$(call update_archive))
534*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN(CC_STATIC_LIBRARY*)
535*d95af8dfSAndroid Build Coastguard Worker
536*d95af8dfSAndroid Build Coastguard WorkerCC_STATIC_LIBARY(%):
537*d95af8dfSAndroid Build Coastguard Worker	$(error Typo alert! LIBARY != LIBRARY)
538*d95af8dfSAndroid Build Coastguard Worker
539*d95af8dfSAndroid Build Coastguard Worker
540*d95af8dfSAndroid Build Coastguard WorkerTEST(%): %
541*d95af8dfSAndroid Build Coastguard Worker	$(call TEST_implementation)
542*d95af8dfSAndroid Build Coastguard Workerifneq ($(RUN_TESTS),0)
543*d95af8dfSAndroid Build Coastguard WorkerTEST(%): qemu_chroot_install
544*d95af8dfSAndroid Build Coastguard Workerendif
545*d95af8dfSAndroid Build Coastguard Worker.PHONY: TEST
546*d95af8dfSAndroid Build Coastguard Worker
547*d95af8dfSAndroid Build Coastguard Worker# multiple targets with a wildcard need to share an directory.
548*d95af8dfSAndroid Build Coastguard Worker# Don't use this directly it just makes sure the directory is removed _after_
549*d95af8dfSAndroid Build Coastguard Worker# the files are.
550*d95af8dfSAndroid Build Coastguard WorkerCLEANFILE(%):
551*d95af8dfSAndroid Build Coastguard Worker	$(call silent_rm,$(TARGET_OR_MEMBER))
552*d95af8dfSAndroid Build Coastguard Worker.PHONY: CLEANFILE
553*d95af8dfSAndroid Build Coastguard Worker
554*d95af8dfSAndroid Build Coastguard WorkerCLEAN(%): CLEANFILE(%)
555*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)# CLEAN($%) meta-target called
556*d95af8dfSAndroid Build Coastguard Worker	$(if $(filter-out $(PWD)/,$(dir $(abspath $(TARGET_OR_MEMBER)))), \
557*d95af8dfSAndroid Build Coastguard Worker	  $(call silent_rmdir,$(dir $(abspath $(TARGET_OR_MEMBER)))),\
558*d95af8dfSAndroid Build Coastguard Worker	  $(QUIET)# Not deleting $(dir $(abspath $(TARGET_OR_MEMBER))) yet.)
559*d95af8dfSAndroid Build Coastguard Worker.PHONY: CLEAN
560*d95af8dfSAndroid Build Coastguard Worker
561*d95af8dfSAndroid Build Coastguard Worker#
562*d95af8dfSAndroid Build Coastguard Worker# Top-level objects and pattern rules
563*d95af8dfSAndroid Build Coastguard Worker#
564*d95af8dfSAndroid Build Coastguard Worker
565*d95af8dfSAndroid Build Coastguard Worker# All objects for .c files at the top level
566*d95af8dfSAndroid Build Coastguard WorkerC_OBJECTS = $(patsubst $(SRC)/%.c,%.o,$(wildcard $(SRC)/*.c))
567*d95af8dfSAndroid Build Coastguard Worker
568*d95af8dfSAndroid Build Coastguard Worker
569*d95af8dfSAndroid Build Coastguard Worker# All objects for .cxx files at the top level
570*d95af8dfSAndroid Build Coastguard WorkerCXX_OBJECTS = $(patsubst $(SRC)/%.cc,%.o,$(wildcard $(SRC)/*.cc))
571*d95af8dfSAndroid Build Coastguard Worker
572*d95af8dfSAndroid Build Coastguard Worker# Note, the catch-all pattern rules don't work in subdirectories because
573*d95af8dfSAndroid Build Coastguard Worker# we're building from the $(OUT) directory. At the top-level (here) they will
574*d95af8dfSAndroid Build Coastguard Worker# work, but we go ahead and match using the module form.  Then we can place a
575*d95af8dfSAndroid Build Coastguard Worker# generic pattern rule to capture leakage from the main Makefile. (Later in the
576*d95af8dfSAndroid Build Coastguard Worker# file.)
577*d95af8dfSAndroid Build Coastguard Worker#
578*d95af8dfSAndroid Build Coastguard Worker# The reason target specific pattern rules work well for modules,
579*d95af8dfSAndroid Build Coastguard Worker# MODULE_C_OBJECTS, is because it scopes the behavior to the given target which
580*d95af8dfSAndroid Build Coastguard Worker# ensures we get a relative directory offset from $(OUT) which otherwise would
581*d95af8dfSAndroid Build Coastguard Worker# not match without further magic on a per-subdirectory basis.
582*d95af8dfSAndroid Build Coastguard Worker
583*d95af8dfSAndroid Build Coastguard Worker# Creates object file rules. Call with eval.
584*d95af8dfSAndroid Build Coastguard Worker# $(1) list of .o files
585*d95af8dfSAndroid Build Coastguard Worker# $(2) source type (CC or CXX)
586*d95af8dfSAndroid Build Coastguard Worker# $(3) source suffix (cc or c)
587*d95af8dfSAndroid Build Coastguard Worker# $(4) compiler flag name (CFLAGS or CXXFLAGS)
588*d95af8dfSAndroid Build Coastguard Worker# $(5) source dir: _only_ if $(SRC). Leave blank for obj tree.
589*d95af8dfSAndroid Build Coastguard Workerdefine add_object_rules
590*d95af8dfSAndroid Build Coastguard Worker$(patsubst %.o,%.pie.o,$(1)): %.pie.o: $(5)%.$(3) %.o.depends
591*d95af8dfSAndroid Build Coastguard Worker	$$(call auto_mkdir,$$@)
592*d95af8dfSAndroid Build Coastguard Worker	$$(call OBJECT_PATTERN_implementation,$(2),\
593*d95af8dfSAndroid Build Coastguard Worker          $$(basename $$@),$$($(4)) $$(CPPFLAGS) $$(OBJ_PIE_FLAG))
594*d95af8dfSAndroid Build Coastguard Worker
595*d95af8dfSAndroid Build Coastguard Worker$(patsubst %.o,%.pic.o,$(1)): %.pic.o: $(5)%.$(3) %.o.depends
596*d95af8dfSAndroid Build Coastguard Worker	$$(call auto_mkdir,$$@)
597*d95af8dfSAndroid Build Coastguard Worker	$$(call OBJECT_PATTERN_implementation,$(2),\
598*d95af8dfSAndroid Build Coastguard Worker          $$(basename $$@),$$($(4)) $$(CPPFLAGS) -fPIC)
599*d95af8dfSAndroid Build Coastguard Worker
600*d95af8dfSAndroid Build Coastguard Worker# Placeholder for depends
601*d95af8dfSAndroid Build Coastguard Worker$(patsubst %.o,%.o.depends,$(1)):
602*d95af8dfSAndroid Build Coastguard Worker	$$(call auto_mkdir,$$@)
603*d95af8dfSAndroid Build Coastguard Worker	$$(QUIET)touch "$$@"
604*d95af8dfSAndroid Build Coastguard Worker
605*d95af8dfSAndroid Build Coastguard Worker$(1): %.o: %.pic.o %.pie.o
606*d95af8dfSAndroid Build Coastguard Worker	$$(call auto_mkdir,$$@)
607*d95af8dfSAndroid Build Coastguard Worker	$$(QUIET)touch "$$@"
608*d95af8dfSAndroid Build Coastguard Workerendef
609*d95af8dfSAndroid Build Coastguard Worker
610*d95af8dfSAndroid Build Coastguard Worker# Wrap all the deps in $$(wildcard) so a missing header won't cause weirdness.
611*d95af8dfSAndroid Build Coastguard Worker# First we remove newlines and \, then wrap it.
612*d95af8dfSAndroid Build Coastguard Workerdefine OBJECT_PATTERN_implementation
613*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "$(1)		$(subst $(SRC)/,,$<) -> $(2).o"
614*d95af8dfSAndroid Build Coastguard Worker  $(call auto_mkdir,$@)
615*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$($(1)) -c -MD -MF $(2).d $(3) -o $(2).o $<
616*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)sed -i -e :j -e '$$!N;s|\\\s*\n| |;tj' \
617*d95af8dfSAndroid Build Coastguard Worker    -e 's|^\(.*\s*:\s*\)\(.*\)$$|\1 $$\(wildcard \2\)|' $(2).d
618*d95af8dfSAndroid Build Coastguard Workerendef
619*d95af8dfSAndroid Build Coastguard Worker
620*d95af8dfSAndroid Build Coastguard Worker# Now actually register handlers for C(XX)_OBJECTS.
621*d95af8dfSAndroid Build Coastguard Worker$(eval $(call add_object_rules,$(C_OBJECTS),CC,c,CFLAGS,$(SRC)/))
622*d95af8dfSAndroid Build Coastguard Worker$(eval $(call add_object_rules,$(CXX_OBJECTS),CXX,cc,CXXFLAGS,$(SRC)/))
623*d95af8dfSAndroid Build Coastguard Worker
624*d95af8dfSAndroid Build Coastguard Worker# Disable default pattern rules to help avoid leakage.
625*d95af8dfSAndroid Build Coastguard Worker# These may already be handled by '-r', but let's keep it to be safe.
626*d95af8dfSAndroid Build Coastguard Worker%: %.o ;
627*d95af8dfSAndroid Build Coastguard Worker%.a: %.o ;
628*d95af8dfSAndroid Build Coastguard Worker%.o: %.c ;
629*d95af8dfSAndroid Build Coastguard Worker%.o: %.cc ;
630*d95af8dfSAndroid Build Coastguard Worker
631*d95af8dfSAndroid Build Coastguard Worker# NOTE: A specific rule for archive objects is avoided because parallel
632*d95af8dfSAndroid Build Coastguard Worker#       update of the archive causes build flakiness.
633*d95af8dfSAndroid Build Coastguard Worker# Instead, just make the objects the prerequisites and use update_archive
634*d95af8dfSAndroid Build Coastguard Worker# To use the foo.a(obj.o) functionality, targets would need to specify the
635*d95af8dfSAndroid Build Coastguard Worker# explicit object they expect on the prerequisite line.
636*d95af8dfSAndroid Build Coastguard Worker
637*d95af8dfSAndroid Build Coastguard Worker#
638*d95af8dfSAndroid Build Coastguard Worker# Architecture detection and QEMU wrapping
639*d95af8dfSAndroid Build Coastguard Worker#
640*d95af8dfSAndroid Build Coastguard Worker
641*d95af8dfSAndroid Build Coastguard WorkerHOST_ARCH ?= $(shell uname -m)
642*d95af8dfSAndroid Build Coastguard Workeroverride ARCH := $(strip $(ARCH))
643*d95af8dfSAndroid Build Coastguard Workeroverride HOST_ARCH := $(strip $(HOST_ARCH))
644*d95af8dfSAndroid Build Coastguard Worker# emake will supply "x86" or "arm" for ARCH, but
645*d95af8dfSAndroid Build Coastguard Worker# if uname -m runs and you get x86_64, then this subst
646*d95af8dfSAndroid Build Coastguard Worker# will break.
647*d95af8dfSAndroid Build Coastguard Workerifeq ($(subst x86,i386,$(ARCH)),i386)
648*d95af8dfSAndroid Build Coastguard Worker  QEMU_ARCH := $(subst x86,i386,$(ARCH))  # x86 -> i386
649*d95af8dfSAndroid Build Coastguard Workerelse ifeq ($(subst amd64,x86_64,$(ARCH)),x86_64)
650*d95af8dfSAndroid Build Coastguard Worker  QEMU_ARCH := $(subst amd64,x86_64,$(ARCH))  # amd64 -> x86_64
651*d95af8dfSAndroid Build Coastguard Workerelse
652*d95af8dfSAndroid Build Coastguard Worker  QEMU_ARCH = $(ARCH)
653*d95af8dfSAndroid Build Coastguard Workerendif
654*d95af8dfSAndroid Build Coastguard Workeroverride QEMU_ARCH := $(strip $(QEMU_ARCH))
655*d95af8dfSAndroid Build Coastguard Worker
656*d95af8dfSAndroid Build Coastguard Worker# If we're cross-compiling, try to use qemu for running the tests.
657*d95af8dfSAndroid Build Coastguard Workerifneq ($(QEMU_ARCH),$(HOST_ARCH))
658*d95af8dfSAndroid Build Coastguard Worker  ifeq ($(SYSROOT),)
659*d95af8dfSAndroid Build Coastguard Worker    $(info SYSROOT not defined. qemu-based testing disabled)
660*d95af8dfSAndroid Build Coastguard Worker  else
661*d95af8dfSAndroid Build Coastguard Worker    # A SYSROOT is assumed for QEmu use.
662*d95af8dfSAndroid Build Coastguard Worker    USE_QEMU ?= 1
663*d95af8dfSAndroid Build Coastguard Worker
664*d95af8dfSAndroid Build Coastguard Worker    # Allow 64-bit hosts to run 32-bit without qemu.
665*d95af8dfSAndroid Build Coastguard Worker    ifeq ($(HOST_ARCH),x86_64)
666*d95af8dfSAndroid Build Coastguard Worker      ifeq ($(QEMU_ARCH),i386)
667*d95af8dfSAndroid Build Coastguard Worker        USE_QEMU = 0
668*d95af8dfSAndroid Build Coastguard Worker      endif
669*d95af8dfSAndroid Build Coastguard Worker    endif
670*d95af8dfSAndroid Build Coastguard Worker  endif
671*d95af8dfSAndroid Build Coastguard Workerelse
672*d95af8dfSAndroid Build Coastguard Worker  USE_QEMU ?= 0
673*d95af8dfSAndroid Build Coastguard Workerendif
674*d95af8dfSAndroid Build Coastguard Worker
675*d95af8dfSAndroid Build Coastguard Worker# Normally we don't need to run as root or do bind mounts, so only
676*d95af8dfSAndroid Build Coastguard Worker# enable it by default when we're using QEMU.
677*d95af8dfSAndroid Build Coastguard WorkerNEEDS_ROOT ?= $(USE_QEMU)
678*d95af8dfSAndroid Build Coastguard WorkerNEEDS_MOUNTS ?= $(USE_QEMU)
679*d95af8dfSAndroid Build Coastguard Worker
680*d95af8dfSAndroid Build Coastguard WorkerSYSROOT_OUT = $(OUT)
681*d95af8dfSAndroid Build Coastguard Workerifneq ($(SYSROOT),)
682*d95af8dfSAndroid Build Coastguard Worker  SYSROOT_OUT = $(subst $(SYSROOT),,$(OUT))
683*d95af8dfSAndroid Build Coastguard Workerelse
684*d95af8dfSAndroid Build Coastguard Worker  # Default to / when all the empty-sysroot logic is done.
685*d95af8dfSAndroid Build Coastguard Worker  SYSROOT = /
686*d95af8dfSAndroid Build Coastguard Workerendif
687*d95af8dfSAndroid Build Coastguard Worker
688*d95af8dfSAndroid Build Coastguard WorkerQEMU_NAME = qemu-$(QEMU_ARCH)
689*d95af8dfSAndroid Build Coastguard WorkerQEMU_PATH = /build/bin/$(QEMU_NAME)
690*d95af8dfSAndroid Build Coastguard WorkerQEMU_SYSROOT_PATH = $(SYSROOT)$(QEMU_PATH)
691*d95af8dfSAndroid Build Coastguard WorkerQEMU_SRC_PATH = /usr/bin/$(QEMU_NAME)
692*d95af8dfSAndroid Build Coastguard WorkerQEMU_BINFMT_PATH = /proc/sys/fs/binfmt_misc/$(QEMU_NAME)
693*d95af8dfSAndroid Build Coastguard WorkerQEMU_REGISTER_PATH = /proc/sys/fs/binfmt_misc/register
694*d95af8dfSAndroid Build Coastguard Worker
695*d95af8dfSAndroid Build Coastguard WorkerQEMU_MAGIC_arm = ":$(QEMU_NAME):M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/build/bin/qemu-arm:"
696*d95af8dfSAndroid Build Coastguard Worker
697*d95af8dfSAndroid Build Coastguard Worker
698*d95af8dfSAndroid Build Coastguard Worker#
699*d95af8dfSAndroid Build Coastguard Worker# Output full configuration at top level
700*d95af8dfSAndroid Build Coastguard Worker#
701*d95af8dfSAndroid Build Coastguard Worker
702*d95af8dfSAndroid Build Coastguard Worker# Don't show on clean
703*d95af8dfSAndroid Build Coastguard Workerifneq ($(MAKECMDGOALS),clean)
704*d95af8dfSAndroid Build Coastguard Worker  $(info build configuration:)
705*d95af8dfSAndroid Build Coastguard Worker  $(info - OUT=$(OUT))
706*d95af8dfSAndroid Build Coastguard Worker  $(info - SRC=$(SRC))
707*d95af8dfSAndroid Build Coastguard Worker  $(info - MODE=$(MODE))
708*d95af8dfSAndroid Build Coastguard Worker  $(info - SPLITDEBUG=$(SPLITDEBUG))
709*d95af8dfSAndroid Build Coastguard Worker  $(info - NOSTRIP=$(NOSTRIP))
710*d95af8dfSAndroid Build Coastguard Worker  $(info - VALGRIND=$(VALGRIND))
711*d95af8dfSAndroid Build Coastguard Worker  $(info - COLOR=$(COLOR))
712*d95af8dfSAndroid Build Coastguard Worker  $(info - CXXEXCEPTIONS=$(CXXEXCEPTIONS))
713*d95af8dfSAndroid Build Coastguard Worker  $(info - ARCH=$(ARCH))
714*d95af8dfSAndroid Build Coastguard Worker  $(info - QEMU_ARCH=$(QEMU_ARCH))
715*d95af8dfSAndroid Build Coastguard Worker  $(info - USE_QEMU=$(USE_QEMU))
716*d95af8dfSAndroid Build Coastguard Worker  $(info - NEEDS_ROOT=$(NEEDS_ROOT))
717*d95af8dfSAndroid Build Coastguard Worker  $(info - NEEDS_MOUNTS=$(NEEDS_MOUNTS))
718*d95af8dfSAndroid Build Coastguard Worker  $(info - SYSROOT=$(SYSROOT))
719*d95af8dfSAndroid Build Coastguard Worker  $(info )
720*d95af8dfSAndroid Build Coastguard Workerendif
721*d95af8dfSAndroid Build Coastguard Worker
722*d95af8dfSAndroid Build Coastguard Worker#
723*d95af8dfSAndroid Build Coastguard Worker# Standard targets with detection for when they are improperly configured.
724*d95af8dfSAndroid Build Coastguard Worker#
725*d95af8dfSAndroid Build Coastguard Worker
726*d95af8dfSAndroid Build Coastguard Worker# all does not include tests by default
727*d95af8dfSAndroid Build Coastguard Workerall:
728*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)(test -z "$^" && \
729*d95af8dfSAndroid Build Coastguard Worker	$(ECHO) "You must add your targets as 'all' prerequisites") || true
730*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)test -n "$^"
731*d95af8dfSAndroid Build Coastguard Worker
732*d95af8dfSAndroid Build Coastguard Worker# Builds and runs tests for the target arch
733*d95af8dfSAndroid Build Coastguard Worker# Run them in parallel
734*d95af8dfSAndroid Build Coastguard Worker# After the test have completed, if profiling, run coverage analysis
735*d95af8dfSAndroid Build Coastguard Workertests:
736*d95af8dfSAndroid Build Coastguard Workerifeq ($(MODE),profiling)
737*d95af8dfSAndroid Build Coastguard Worker	@$(ECHO) "COVERAGE [$(COLOR_YELLOW)STARTED$(COLOR_RESET)]"
738*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)FILES="";						\
739*d95af8dfSAndroid Build Coastguard Worker		for GCNO in `find . -name "*.gcno"`; do			\
740*d95af8dfSAndroid Build Coastguard Worker			GCDA="$${GCNO%.gcno}.gcda";			\
741*d95af8dfSAndroid Build Coastguard Worker			if [ -e $${GCDA} ]; then			\
742*d95af8dfSAndroid Build Coastguard Worker				FILES="$${FILES} $${GCDA}";		\
743*d95af8dfSAndroid Build Coastguard Worker			fi						\
744*d95af8dfSAndroid Build Coastguard Worker		done;							\
745*d95af8dfSAndroid Build Coastguard Worker		if [ -n "$${FILES}" ]; then				\
746*d95af8dfSAndroid Build Coastguard Worker			gcov -l $${FILES};				\
747*d95af8dfSAndroid Build Coastguard Worker			lcov --capture --directory .			\
748*d95af8dfSAndroid Build Coastguard Worker				--output-file=lcov-coverage.info;	\
749*d95af8dfSAndroid Build Coastguard Worker			genhtml lcov-coverage.info			\
750*d95af8dfSAndroid Build Coastguard Worker				--output-directory lcov-html;		\
751*d95af8dfSAndroid Build Coastguard Worker		fi
752*d95af8dfSAndroid Build Coastguard Worker	@$(ECHO) "COVERAGE [$(COLOR_YELLOW)FINISHED$(COLOR_RESET)]"
753*d95af8dfSAndroid Build Coastguard Workerendif
754*d95af8dfSAndroid Build Coastguard Worker# Standard name everyone else uses.
755*d95af8dfSAndroid Build Coastguard Workercheck: tests
756*d95af8dfSAndroid Build Coastguard Worker.PHONY: check tests
757*d95af8dfSAndroid Build Coastguard Worker
758*d95af8dfSAndroid Build Coastguard Workerqemu_chroot_install:
759*d95af8dfSAndroid Build Coastguard Workerifeq ($(USE_QEMU),1)
760*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)$(ECHO) "QEMU   Preparing $(QEMU_NAME)"
761*d95af8dfSAndroid Build Coastguard Worker	@# Copying strategy
762*d95af8dfSAndroid Build Coastguard Worker	@# Compare /usr/bin/qemu inode to /build/$board/build/bin/qemu, if different
763*d95af8dfSAndroid Build Coastguard Worker	@# hard link to a temporary file, then rename temp to target. This should
764*d95af8dfSAndroid Build Coastguard Worker	@# ensure that once $QEMU_SYSROOT_PATH exists it will always exist, regardless
765*d95af8dfSAndroid Build Coastguard Worker	@# of simultaneous test setups.
766*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)if [[ ! -e $(QEMU_SYSROOT_PATH) || \
767*d95af8dfSAndroid Build Coastguard Worker	    `stat -c %i $(QEMU_SRC_PATH)` != `stat -c %i $(QEMU_SYSROOT_PATH)` \
768*d95af8dfSAndroid Build Coastguard Worker	    ]]; then \
769*d95af8dfSAndroid Build Coastguard Worker	  $(ROOT_CMD) ln -Tf $(QEMU_SRC_PATH) $(QEMU_SYSROOT_PATH).$$$$; \
770*d95af8dfSAndroid Build Coastguard Worker	  $(ROOT_CMD) mv -Tf $(QEMU_SYSROOT_PATH).$$$$ $(QEMU_SYSROOT_PATH); \
771*d95af8dfSAndroid Build Coastguard Worker	fi
772*d95af8dfSAndroid Build Coastguard Worker
773*d95af8dfSAndroid Build Coastguard Worker	@# Prep the binfmt handler. First mount if needed, then unregister any bad
774*d95af8dfSAndroid Build Coastguard Worker	@# mappings and then register our mapping.
775*d95af8dfSAndroid Build Coastguard Worker	@# There may still be some race conditions here where one script de-registers
776*d95af8dfSAndroid Build Coastguard Worker	@# and another script starts executing before it gets re-registered, however
777*d95af8dfSAndroid Build Coastguard Worker	@# it should be rare.
778*d95af8dfSAndroid Build Coastguard Worker	-$(QUIET)[[ -e $(QEMU_REGISTER_PATH) ]] || \
779*d95af8dfSAndroid Build Coastguard Worker	  $(ROOT_CMD) mount binfmt_misc -t binfmt_misc \
780*d95af8dfSAndroid Build Coastguard Worker	    /proc/sys/fs/binfmt_misc
781*d95af8dfSAndroid Build Coastguard Worker
782*d95af8dfSAndroid Build Coastguard Worker	-$(QUIET)if [[ -e $(QEMU_BINFMT_PATH) && \
783*d95af8dfSAndroid Build Coastguard Worker	      `awk '$$1 == "interpreter" {print $$NF}' $(QEMU_BINFMT_PATH)` != \
784*d95af8dfSAndroid Build Coastguard Worker	      "$(QEMU_PATH)" ]]; then \
785*d95af8dfSAndroid Build Coastguard Worker	  echo -1 | $(ROOT_CMD) tee $(QEMU_BINFMT_PATH) >/dev/null; \
786*d95af8dfSAndroid Build Coastguard Worker	fi
787*d95af8dfSAndroid Build Coastguard Worker
788*d95af8dfSAndroid Build Coastguard Worker	-$(if $(QEMU_MAGIC_$(ARCH)),$(QUIET)[[ -e $(QEMU_BINFMT_PATH) ]] || \
789*d95af8dfSAndroid Build Coastguard Worker	  echo $(QEMU_MAGIC_$(ARCH)) | $(ROOT_CMD) tee $(QEMU_REGISTER_PATH) \
790*d95af8dfSAndroid Build Coastguard Worker	    >/dev/null)
791*d95af8dfSAndroid Build Coastguard Workerendif
792*d95af8dfSAndroid Build Coastguard Worker.PHONY: qemu_clean qemu_chroot_install
793*d95af8dfSAndroid Build Coastguard Worker
794*d95af8dfSAndroid Build Coastguard Worker# TODO(wad) Move to -L $(SYSROOT) and fakechroot when qemu-user
795*d95af8dfSAndroid Build Coastguard Worker#           doesn't hang traversing /proc from SYSROOT.
796*d95af8dfSAndroid Build Coastguard WorkerSUDO_CMD = sudo
797*d95af8dfSAndroid Build Coastguard WorkerUNSHARE_CMD = unshare
798*d95af8dfSAndroid Build Coastguard WorkerQEMU_CMD =
799*d95af8dfSAndroid Build Coastguard WorkerROOT_CMD = $(if $(filter 1,$(NEEDS_ROOT)),$(SUDO_CMD) , )
800*d95af8dfSAndroid Build Coastguard WorkerMOUNT_CMD = $(if $(filter 1,$(NEEDS_MOUNTS)),$(ROOT_CMD) mount, \#)
801*d95af8dfSAndroid Build Coastguard WorkerUMOUNT_CMD = $(if $(filter 1,$(NEEDS_MOUNTS)),$(ROOT_CMD) umount, \#)
802*d95af8dfSAndroid Build Coastguard WorkerQEMU_LDPATH = $(SYSROOT_LDPATH):/lib64:/lib:/usr/lib64:/usr/lib
803*d95af8dfSAndroid Build Coastguard WorkerROOT_CMD_LDPATH = $(SYSROOT_LDPATH):$(SYSROOT)/lib64:
804*d95af8dfSAndroid Build Coastguard WorkerROOT_CMD_LDPATH := $(ROOT_CMD_LDPATH):$(SYSROOT)/lib:$(SYSROOT)/usr/lib64:
805*d95af8dfSAndroid Build Coastguard WorkerROOT_CMD_LDPATH := $(ROOT_CMD_LDPATH):$(SYSROOT)/usr/lib
806*d95af8dfSAndroid Build Coastguard Workerifeq ($(USE_QEMU),1)
807*d95af8dfSAndroid Build Coastguard Worker  export QEMU_CMD = \
808*d95af8dfSAndroid Build Coastguard Worker   $(SUDO_CMD) chroot $(SYSROOT) $(QEMU_PATH) \
809*d95af8dfSAndroid Build Coastguard Worker   -drop-ld-preload \
810*d95af8dfSAndroid Build Coastguard Worker   -E LD_LIBRARY_PATH="$(QEMU_LDPATH):$(patsubst $(OUT),,$(LD_DIRS))" \
811*d95af8dfSAndroid Build Coastguard Worker   -E HOME="$(HOME)" -E SRC="$(SRC)" --
812*d95af8dfSAndroid Build Coastguard Worker  # USE_QEMU conditional function
813*d95af8dfSAndroid Build Coastguard Worker  define if_qemu
814*d95af8dfSAndroid Build Coastguard Worker    $(1)
815*d95af8dfSAndroid Build Coastguard Worker  endef
816*d95af8dfSAndroid Build Coastguard Workerelse
817*d95af8dfSAndroid Build Coastguard Worker  ROOT_CMD = $(if $(filter 1,$(NEEDS_ROOT)),sudo, ) \
818*d95af8dfSAndroid Build Coastguard Worker    LD_LIBRARY_PATH="$(ROOT_CMD_LDPATH):$(LD_DIRS)"
819*d95af8dfSAndroid Build Coastguard Worker  define if_qemu
820*d95af8dfSAndroid Build Coastguard Worker    $(2)
821*d95af8dfSAndroid Build Coastguard Worker  endef
822*d95af8dfSAndroid Build Coastguard Workerendif
823*d95af8dfSAndroid Build Coastguard Worker
824*d95af8dfSAndroid Build Coastguard WorkerVALGRIND_CMD =
825*d95af8dfSAndroid Build Coastguard Workerifeq ($(VALGRIND),1)
826*d95af8dfSAndroid Build Coastguard Worker  VALGRIND_CMD = /usr/bin/valgrind --tool=memcheck $(VALGRIND_ARGS) --
827*d95af8dfSAndroid Build Coastguard Workerendif
828*d95af8dfSAndroid Build Coastguard Worker
829*d95af8dfSAndroid Build Coastguard Workerifneq ($(RUN_TESTS),0)
830*d95af8dfSAndroid Build Coastguard Workerdefine TEST_implementation
831*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$(call TEST_setup)
832*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$(call TEST_run)
833*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)$(call TEST_teardown)
834*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)exit $$(cat $(OUT)$(TARGET_OR_MEMBER).status.test)
835*d95af8dfSAndroid Build Coastguard Workerendef
836*d95af8dfSAndroid Build Coastguard Workerelse
837*d95af8dfSAndroid Build Coastguard Workerdefine TEST_implementation
838*d95af8dfSAndroid Build Coastguard Workerendef
839*d95af8dfSAndroid Build Coastguard Workerendif
840*d95af8dfSAndroid Build Coastguard Worker
841*d95af8dfSAndroid Build Coastguard Workerdefine TEST_setup
842*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) -n "TEST		$(TARGET_OR_MEMBER) "
843*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "[$(COLOR_YELLOW)SETUP$(COLOR_RESET)]"
844*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# Setup a target-specific results file
845*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)(echo > $(OUT)$(TARGET_OR_MEMBER).setup.test)
846*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)(echo 1 > $(OUT)$(TARGET_OR_MEMBER).status.test)
847*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)(echo > $(OUT)$(TARGET_OR_MEMBER).cleanup.test)
848*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# No setup if we are not using QEMU
849*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)# TODO(wad) this is racy until we use a vfs namespace
850*d95af8dfSAndroid Build Coastguard Worker  $(call if_qemu,\
851*d95af8dfSAndroid Build Coastguard Worker    $(QUIET)(echo "mkdir -p '$(SYSROOT)/proc' '$(SYSROOT)/dev' \
852*d95af8dfSAndroid Build Coastguard Worker                            '$(SYSROOT)/mnt/host/source'" \
853*d95af8dfSAndroid Build Coastguard Worker             >> "$(OUT)$(TARGET_OR_MEMBER).setup.test"))
854*d95af8dfSAndroid Build Coastguard Worker  $(call if_qemu,\
855*d95af8dfSAndroid Build Coastguard Worker    $(QUIET)(echo "$(MOUNT_CMD) --bind /mnt/host/source \
856*d95af8dfSAndroid Build Coastguard Worker             '$(SYSROOT)/mnt/host/source'" \
857*d95af8dfSAndroid Build Coastguard Worker             >> "$(OUT)$(TARGET_OR_MEMBER).setup.test"))
858*d95af8dfSAndroid Build Coastguard Worker  $(call if_qemu,\
859*d95af8dfSAndroid Build Coastguard Worker    $(QUIET)(echo "$(MOUNT_CMD) --bind /proc '$(SYSROOT)/proc'" \
860*d95af8dfSAndroid Build Coastguard Worker             >> "$(OUT)$(TARGET_OR_MEMBER).setup.test"))
861*d95af8dfSAndroid Build Coastguard Worker  $(call if_qemu,\
862*d95af8dfSAndroid Build Coastguard Worker    $(QUIET)(echo "$(MOUNT_CMD) --bind /dev '$(SYSROOT)/dev'" \
863*d95af8dfSAndroid Build Coastguard Worker             >> "$(OUT)$(TARGET_OR_MEMBER).setup.test"))
864*d95af8dfSAndroid Build Coastguard Workerendef
865*d95af8dfSAndroid Build Coastguard Worker
866*d95af8dfSAndroid Build Coastguard Workerdefine TEST_teardown
867*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) -n "TEST		$(TARGET_OR_MEMBER) "
868*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "[$(COLOR_YELLOW)TEARDOWN$(COLOR_RESET)]"
869*d95af8dfSAndroid Build Coastguard Worker  $(call if_qemu, $(QUIET)$(SHELL) "$(OUT)$(TARGET_OR_MEMBER).cleanup.test")
870*d95af8dfSAndroid Build Coastguard Workerendef
871*d95af8dfSAndroid Build Coastguard Worker
872*d95af8dfSAndroid Build Coastguard Worker# Use GTEST_ARGS.[arch] if defined.
873*d95af8dfSAndroid Build Coastguard Workeroverride GTEST_ARGS.real = \
874*d95af8dfSAndroid Build Coastguard Worker $(call if_qemu,$(GTEST_ARGS.qemu.$(QEMU_ARCH)),$(GTEST_ARGS.host.$(HOST_ARCH)))
875*d95af8dfSAndroid Build Coastguard Worker
876*d95af8dfSAndroid Build Coastguard Workerdefine TEST_run
877*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) -n "TEST		$(TARGET_OR_MEMBER) "
878*d95af8dfSAndroid Build Coastguard Worker  @$(ECHO) "[$(COLOR_GREEN)RUN$(COLOR_RESET)]"
879*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)(echo 1 > "$(OUT)$(TARGET_OR_MEMBER).status.test")
880*d95af8dfSAndroid Build Coastguard Worker  $(QUIET)(echo $(ROOT_CMD) SRC="$(SRC)" $(QEMU_CMD) $(VALGRIND_CMD) \
881*d95af8dfSAndroid Build Coastguard Worker    "$(strip $(call if_qemu, $(SYSROOT_OUT),$(OUT))$(TARGET_OR_MEMBER))" \
882*d95af8dfSAndroid Build Coastguard Worker      $(if $(filter-out 0,$(words $(GTEST_ARGS.real))),$(GTEST_ARGS.real),\
883*d95af8dfSAndroid Build Coastguard Worker           $(GTEST_ARGS)) >> "$(OUT)$(TARGET_OR_MEMBER).setup.test")
884*d95af8dfSAndroid Build Coastguard Worker  -$(QUIET)$(call if_qemu,$(SUDO_CMD) $(UNSHARE_CMD) -m) $(SHELL) \
885*d95af8dfSAndroid Build Coastguard Worker      $(OUT)$(TARGET_OR_MEMBER).setup.test \
886*d95af8dfSAndroid Build Coastguard Worker  && echo 0 > "$(OUT)$(TARGET_OR_MEMBER).status.test"
887*d95af8dfSAndroid Build Coastguard Workerendef
888*d95af8dfSAndroid Build Coastguard Worker
889*d95af8dfSAndroid Build Coastguard Worker# Recursive list reversal so that we get RMDIR_ON_CLEAN in reverse order.
890*d95af8dfSAndroid Build Coastguard Workerdefine reverse
891*d95af8dfSAndroid Build Coastguard Worker$(if $(1),$(call reverse,$(wordlist 2,$(words $(1)),$(1)))) $(firstword $(1))
892*d95af8dfSAndroid Build Coastguard Workerendef
893*d95af8dfSAndroid Build Coastguard Worker
894*d95af8dfSAndroid Build Coastguard Workerclean: qemu_clean
895*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)*.d) CLEAN($(OUT)*.o) CLEAN($(OUT)*.debug)
896*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)*.test) CLEAN($(OUT)*.depends)
897*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)*.gcno) CLEAN($(OUT)*.gcda) CLEAN($(OUT)*.gcov)
898*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)lcov-coverage.info) CLEAN($(OUT)lcov-html)
899*d95af8dfSAndroid Build Coastguard Worker
900*d95af8dfSAndroid Build Coastguard Workerclean:
901*d95af8dfSAndroid Build Coastguard Worker	$(QUIET)# Always delete the containing directory last.
902*d95af8dfSAndroid Build Coastguard Worker	$(call silent_rmdir,$(OUT))
903*d95af8dfSAndroid Build Coastguard Worker
904*d95af8dfSAndroid Build Coastguard WorkerFORCE: ;
905*d95af8dfSAndroid Build Coastguard Worker# Empty rule for use when no special targets are needed, like large_tests
906*d95af8dfSAndroid Build Coastguard WorkerNONE:
907*d95af8dfSAndroid Build Coastguard Worker
908*d95af8dfSAndroid Build Coastguard Worker.PHONY: clean NONE valgrind NONE
909*d95af8dfSAndroid Build Coastguard Worker.DEFAULT_GOAL  :=  all
910*d95af8dfSAndroid Build Coastguard Worker# Don't let make blow away "intermediates"
911*d95af8dfSAndroid Build Coastguard Worker.PRECIOUS: %.pic.o %.pie.o %.a %.pic.a %.pie.a %.test
912*d95af8dfSAndroid Build Coastguard Worker
913*d95af8dfSAndroid Build Coastguard Worker# Start accruing build info
914*d95af8dfSAndroid Build Coastguard WorkerOUT_DIRS = $(OUT)
915*d95af8dfSAndroid Build Coastguard WorkerLD_DIRS = $(OUT)
916*d95af8dfSAndroid Build Coastguard WorkerSRC_DIRS = $(SRC)
917*d95af8dfSAndroid Build Coastguard Worker
918*d95af8dfSAndroid Build Coastguard Workerinclude $(wildcard $(OUT)*.d)
919*d95af8dfSAndroid Build Coastguard WorkerSUBMODULE_DIRS = $(wildcard $(SRC)/*/module.mk)
920*d95af8dfSAndroid Build Coastguard Workerinclude $(SUBMODULE_DIRS)
921*d95af8dfSAndroid Build Coastguard Worker
922*d95af8dfSAndroid Build Coastguard Worker
923*d95af8dfSAndroid Build Coastguard Workerelse  ## In duplicate inclusions of common.mk
924*d95af8dfSAndroid Build Coastguard Worker
925*d95af8dfSAndroid Build Coastguard Worker# Get the current inclusion directory without a trailing slash
926*d95af8dfSAndroid Build Coastguard WorkerMODULE := $(patsubst %/,%, \
927*d95af8dfSAndroid Build Coastguard Worker           $(dir $(lastword $(filter-out %common.mk,$(MAKEFILE_LIST)))))
928*d95af8dfSAndroid Build Coastguard WorkerMODULE := $(subst $(SRC)/,,$(MODULE))
929*d95af8dfSAndroid Build Coastguard WorkerMODULE_NAME := $(subst /,_,$(MODULE))
930*d95af8dfSAndroid Build Coastguard Worker#VPATH := $(MODULE):$(VPATH)
931*d95af8dfSAndroid Build Coastguard Worker
932*d95af8dfSAndroid Build Coastguard Worker
933*d95af8dfSAndroid Build Coastguard Worker# Depth first
934*d95af8dfSAndroid Build Coastguard Worker$(eval OUT_DIRS += $(OUT)$(MODULE))
935*d95af8dfSAndroid Build Coastguard Worker$(eval SRC_DIRS += $(OUT)$(MODULE))
936*d95af8dfSAndroid Build Coastguard Worker$(eval LD_DIRS := $(LD_DIRS):$(OUT)$(MODULE))
937*d95af8dfSAndroid Build Coastguard Worker
938*d95af8dfSAndroid Build Coastguard Worker# Add the defaults from this dir to rm_clean
939*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)$(MODULE)/*.d) CLEAN($(OUT)$(MODULE)/*.o)
940*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)$(MODULE)/*.debug) CLEAN($(OUT)$(MODULE)/*.test)
941*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)$(MODULE)/*.depends)
942*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)$(MODULE)/*.gcno) CLEAN($(OUT)$(MODULE)/*.gcda)
943*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)$(MODULE)/*.gcov) CLEAN($(OUT)lcov-coverage.info)
944*d95af8dfSAndroid Build Coastguard Workerclean: CLEAN($(OUT)lcov-html)
945*d95af8dfSAndroid Build Coastguard Worker
946*d95af8dfSAndroid Build Coastguard Worker$(info + submodule: $(MODULE_NAME))
947*d95af8dfSAndroid Build Coastguard Worker# We must eval otherwise they may be dropped.
948*d95af8dfSAndroid Build Coastguard WorkerMODULE_C_OBJECTS = $(patsubst $(SRC)/$(MODULE)/%.c,$(MODULE)/%.o,\
949*d95af8dfSAndroid Build Coastguard Worker  $(wildcard $(SRC)/$(MODULE)/*.c))
950*d95af8dfSAndroid Build Coastguard Worker$(eval $(MODULE_NAME)_C_OBJECTS ?= $(MODULE_C_OBJECTS))
951*d95af8dfSAndroid Build Coastguard WorkerMODULE_CXX_OBJECTS = $(patsubst $(SRC)/$(MODULE)/%.cc,$(MODULE)/%.o,\
952*d95af8dfSAndroid Build Coastguard Worker  $(wildcard $(SRC)/$(MODULE)/*.cc))
953*d95af8dfSAndroid Build Coastguard Worker$(eval $(MODULE_NAME)_CXX_OBJECTS ?= $(MODULE_CXX_OBJECTS))
954*d95af8dfSAndroid Build Coastguard Worker
955*d95af8dfSAndroid Build Coastguard Worker# Note, $(MODULE) is implicit in the path to the %.c.
956*d95af8dfSAndroid Build Coastguard Worker# See $(C_OBJECTS) for more details.
957*d95af8dfSAndroid Build Coastguard Worker# Register rules for the module objects.
958*d95af8dfSAndroid Build Coastguard Worker$(eval $(call add_object_rules,$(MODULE_C_OBJECTS),CC,c,CFLAGS,$(SRC)/))
959*d95af8dfSAndroid Build Coastguard Worker$(eval $(call add_object_rules,$(MODULE_CXX_OBJECTS),CXX,cc,CXXFLAGS,$(SRC)/))
960*d95af8dfSAndroid Build Coastguard Worker
961*d95af8dfSAndroid Build Coastguard Worker# Continue recursive inclusion of module.mk files
962*d95af8dfSAndroid Build Coastguard WorkerSUBMODULE_DIRS = $(wildcard $(SRC)/$(MODULE)/*/module.mk)
963*d95af8dfSAndroid Build Coastguard Workerinclude $(wildcard $(OUT)$(MODULE)/*.d)
964*d95af8dfSAndroid Build Coastguard Workerinclude $(SUBMODULE_DIRS)
965*d95af8dfSAndroid Build Coastguard Worker
966*d95af8dfSAndroid Build Coastguard Workerendif
967*d95af8dfSAndroid Build Coastguard Workerendif  ## pass-to-subcall wrapper for relocating the call directory
968