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