1*9e94795aSAndroid Build Coastguard Worker# Copyright (C) 2007 The Android Open Source Project 2*9e94795aSAndroid Build Coastguard Worker# 3*9e94795aSAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License"); 4*9e94795aSAndroid Build Coastguard Worker# you may not use this file except in compliance with the License. 5*9e94795aSAndroid Build Coastguard Worker# You may obtain a copy of the License at 6*9e94795aSAndroid Build Coastguard Worker# 7*9e94795aSAndroid Build Coastguard Worker# http://www.apache.org/licenses/LICENSE-2.0 8*9e94795aSAndroid Build Coastguard Worker# 9*9e94795aSAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software 10*9e94795aSAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS, 11*9e94795aSAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12*9e94795aSAndroid Build Coastguard Worker# See the License for the specific language governing permissions and 13*9e94795aSAndroid Build Coastguard Worker# limitations under the License. 14*9e94795aSAndroid Build Coastguard Worker# 15*9e94795aSAndroid Build Coastguard Worker 16*9e94795aSAndroid Build Coastguard Worker# Absolute path of the present working direcotry. 17*9e94795aSAndroid Build Coastguard Worker# This overrides the shell variable $PWD, which does not necessarily points to 18*9e94795aSAndroid Build Coastguard Worker# the top of the source tree, for example when "make -C" is used in m/mm/mmm. 19*9e94795aSAndroid Build Coastguard WorkerPWD := $(shell pwd) 20*9e94795aSAndroid Build Coastguard Worker 21*9e94795aSAndroid Build Coastguard WorkerTOP := . 22*9e94795aSAndroid Build Coastguard WorkerTOPDIR := 23*9e94795aSAndroid Build Coastguard Worker 24*9e94795aSAndroid Build Coastguard WorkerBUILD_SYSTEM := $(TOPDIR)build/make/core 25*9e94795aSAndroid Build Coastguard Worker 26*9e94795aSAndroid Build Coastguard Worker# Set up various standard variables based on configuration 27*9e94795aSAndroid Build Coastguard Worker# and host information. 28*9e94795aSAndroid Build Coastguard Workerinclude $(BUILD_SYSTEM)/config.mk 29*9e94795aSAndroid Build Coastguard Worker 30*9e94795aSAndroid Build Coastguard Workerinclude $(SOONG_MAKEVARS_MK) 31*9e94795aSAndroid Build Coastguard Worker 32*9e94795aSAndroid Build Coastguard Workerinclude $(BUILD_SYSTEM)/clang/config.mk 33*9e94795aSAndroid Build Coastguard Worker 34*9e94795aSAndroid Build Coastguard Worker# CTS-specific config. 35*9e94795aSAndroid Build Coastguard Worker-include cts/build/config.mk 36*9e94795aSAndroid Build Coastguard Worker# device-tests-specific-config. 37*9e94795aSAndroid Build Coastguard Worker-include tools/tradefederation/build/suites/device-tests/config.mk 38*9e94795aSAndroid Build Coastguard Worker# general-tests-specific-config. 39*9e94795aSAndroid Build Coastguard Worker-include tools/tradefederation/build/suites/general-tests/config.mk 40*9e94795aSAndroid Build Coastguard Worker 41*9e94795aSAndroid Build Coastguard WorkerINTERNAL_CLEAN_STEPS := 42*9e94795aSAndroid Build Coastguard Worker 43*9e94795aSAndroid Build Coastguard Worker# Builds up a list of clean steps. Creates a unique 44*9e94795aSAndroid Build Coastguard Worker# id for each step by taking makefile path, INTERNAL_CLEAN_BUILD_VERSION 45*9e94795aSAndroid Build Coastguard Worker# and appending an increasing number of '@' characters. 46*9e94795aSAndroid Build Coastguard Worker# 47*9e94795aSAndroid Build Coastguard Worker# $(1): shell command to run 48*9e94795aSAndroid Build Coastguard Worker# $(2): indicate to not use makefile path as part of step id if not empty. 49*9e94795aSAndroid Build Coastguard Worker# $(2) should only be used in build/make/core/cleanspec.mk: just for compatibility. 50*9e94795aSAndroid Build Coastguard Workerdefine _add-clean-step 51*9e94795aSAndroid Build Coastguard Worker $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \ 52*9e94795aSAndroid Build Coastguard Worker $(error INTERNAL_CLEAN_BUILD_VERSION not set)) 53*9e94795aSAndroid Build Coastguard Worker $(eval _acs_makefile_prefix := $(lastword $(MAKEFILE_LIST))) 54*9e94795aSAndroid Build Coastguard Worker $(eval _acs_makefile_prefix := $(subst /,_,$(_acs_makefile_prefix))) 55*9e94795aSAndroid Build Coastguard Worker $(eval _acs_makefile_prefix := $(subst .,-,$(_acs_makefile_prefix))) 56*9e94795aSAndroid Build Coastguard Worker $(eval _acs_makefile_prefix := $(_acs_makefile_prefix)_acs) 57*9e94795aSAndroid Build Coastguard Worker $(if $($(_acs_makefile_prefix)),,\ 58*9e94795aSAndroid Build Coastguard Worker $(eval $(_acs_makefile_prefix) := $(INTERNAL_CLEAN_BUILD_VERSION))) 59*9e94795aSAndroid Build Coastguard Worker $(eval $(_acs_makefile_prefix) := $($(_acs_makefile_prefix))@) 60*9e94795aSAndroid Build Coastguard Worker $(if $(strip $(2)),$(eval _acs_id := $($(_acs_makefile_prefix))),\ 61*9e94795aSAndroid Build Coastguard Worker $(eval _acs_id := $(_acs_makefile_prefix)$($(_acs_makefile_prefix)))) 62*9e94795aSAndroid Build Coastguard Worker $(eval INTERNAL_CLEAN_STEPS += $(_acs_id)) 63*9e94795aSAndroid Build Coastguard Worker $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1)) 64*9e94795aSAndroid Build Coastguard Worker $(eval _acs_id :=) 65*9e94795aSAndroid Build Coastguard Worker $(eval _acs_makefile_prefix :=) 66*9e94795aSAndroid Build Coastguard Workerendef 67*9e94795aSAndroid Build Coastguard Workerdefine add-clean-step 68*9e94795aSAndroid Build Coastguard Worker$(eval # for build/make/core/cleanspec.mk, dont use makefile path as part of step id) \ 69*9e94795aSAndroid Build Coastguard Worker$(if $(filter %/cleanspec.mk,$(lastword $(MAKEFILE_LIST))),\ 70*9e94795aSAndroid Build Coastguard Worker $(eval $(call _add-clean-step,$(1),true)),\ 71*9e94795aSAndroid Build Coastguard Worker $(eval $(call _add-clean-step,$(1)))) 72*9e94795aSAndroid Build Coastguard Workerendef 73*9e94795aSAndroid Build Coastguard Worker 74*9e94795aSAndroid Build Coastguard Worker# Defines INTERNAL_CLEAN_BUILD_VERSION and the individual clean steps. 75*9e94795aSAndroid Build Coastguard Worker# cleanspec.mk is outside of the core directory so that more people 76*9e94795aSAndroid Build Coastguard Worker# can have permission to touch it. 77*9e94795aSAndroid Build Coastguard Workerinclude $(BUILD_SYSTEM)/cleanspec.mk 78*9e94795aSAndroid Build Coastguard WorkerINTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION)) 79*9e94795aSAndroid Build Coastguard WorkerINTERNAL_CLEAN_STEPS := $(strip $(INTERNAL_CLEAN_STEPS)) 80*9e94795aSAndroid Build Coastguard Worker 81*9e94795aSAndroid Build Coastguard Worker# If the clean_steps.mk file is missing (usually after a clean build) 82*9e94795aSAndroid Build Coastguard Worker# then we won't do anything. 83*9e94795aSAndroid Build Coastguard WorkerCURRENT_CLEAN_BUILD_VERSION := MISSING 84*9e94795aSAndroid Build Coastguard WorkerCURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS) 85*9e94795aSAndroid Build Coastguard Worker 86*9e94795aSAndroid Build Coastguard Worker# Read the current state from the file, if present. 87*9e94795aSAndroid Build Coastguard Worker# Will set CURRENT_CLEAN_BUILD_VERSION and CURRENT_CLEAN_STEPS. 88*9e94795aSAndroid Build Coastguard Worker# 89*9e94795aSAndroid Build Coastguard Workerclean_steps_file := $(PRODUCT_OUT)/clean_steps.mk 90*9e94795aSAndroid Build Coastguard Worker-include $(clean_steps_file) 91*9e94795aSAndroid Build Coastguard Worker 92*9e94795aSAndroid Build Coastguard Workerifeq ($(CURRENT_CLEAN_BUILD_VERSION),MISSING) 93*9e94795aSAndroid Build Coastguard Worker # Do nothing 94*9e94795aSAndroid Build Coastguard Workerelse ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION)) 95*9e94795aSAndroid Build Coastguard Worker # The major clean version is out-of-date. Do a full clean, and 96*9e94795aSAndroid Build Coastguard Worker # don't even bother with the clean steps. 97*9e94795aSAndroid Build Coastguard Worker $(info *** A clean build is required because of a recent change.) 98*9e94795aSAndroid Build Coastguard Worker $(shell rm -rf $(OUT_DIR)) 99*9e94795aSAndroid Build Coastguard Worker $(info *** Done with the cleaning, now starting the real build.) 100*9e94795aSAndroid Build Coastguard Workerelse 101*9e94795aSAndroid Build Coastguard Worker # The major clean version is correct. Find the list of clean steps 102*9e94795aSAndroid Build Coastguard Worker # that we need to execute to get up-to-date. 103*9e94795aSAndroid Build Coastguard Worker steps := \ 104*9e94795aSAndroid Build Coastguard Worker $(filter-out $(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_STEPS)) 105*9e94795aSAndroid Build Coastguard Worker $(foreach step,$(steps), \ 106*9e94795aSAndroid Build Coastguard Worker $(info Clean step: $(INTERNAL_CLEAN_STEP.$(step))) \ 107*9e94795aSAndroid Build Coastguard Worker $(shell $(INTERNAL_CLEAN_STEP.$(step))) \ 108*9e94795aSAndroid Build Coastguard Worker ) 109*9e94795aSAndroid Build Coastguard Worker 110*9e94795aSAndroid Build Coastguard Worker # Rewrite the clean step for the second arch. 111*9e94795aSAndroid Build Coastguard Worker ifdef TARGET_2ND_ARCH 112*9e94795aSAndroid Build Coastguard Worker # $(1): the clean step cmd 113*9e94795aSAndroid Build Coastguard Worker # $(2): the prefix to search for 114*9e94795aSAndroid Build Coastguard Worker # $(3): the prefix to replace with 115*9e94795aSAndroid Build Coastguard Worker define -cs-rewrite-cleanstep 116*9e94795aSAndroid Build Coastguard Worker $(if $(filter $(2)/%,$(1)),\ 117*9e94795aSAndroid Build Coastguard Worker $(eval _crs_new_cmd := $(patsubst $(2)/%,$(3)/%,$(1)))\ 118*9e94795aSAndroid Build Coastguard Worker $(info Clean step: $(_crs_new_cmd))\ 119*9e94795aSAndroid Build Coastguard Worker $(shell $(_crs_new_cmd))) 120*9e94795aSAndroid Build Coastguard Worker endef 121*9e94795aSAndroid Build Coastguard Worker $(foreach step,$(steps), \ 122*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_INTERMEDIATES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES))\ 123*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES))\ 124*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES))\ 125*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES),$(TARGET_OUT_INTERMEDIATES))\ 126*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES),$(TARGET_OUT_SHARED_LIBRARIES))\ 127*9e94795aSAndroid Build Coastguard Worker $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES))\ 128*9e94795aSAndroid Build Coastguard Worker ) 129*9e94795aSAndroid Build Coastguard Worker endif 130*9e94795aSAndroid Build Coastguard Worker _crs_new_cmd := 131*9e94795aSAndroid Build Coastguard Worker steps := 132*9e94795aSAndroid Build Coastguard Workerendif 133*9e94795aSAndroid Build Coastguard Worker 134*9e94795aSAndroid Build Coastguard Worker# Write the new state to the file. 135*9e94795aSAndroid Build Coastguard Worker# 136*9e94795aSAndroid Build Coastguard Workerifneq ($(CURRENT_CLEAN_BUILD_VERSION)-$(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_BUILD_VERSION)-$(INTERNAL_CLEAN_STEPS)) 137*9e94795aSAndroid Build Coastguard Worker$(shell mkdir -p $(dir $(clean_steps_file))) 138*9e94795aSAndroid Build Coastguard Worker$(file >$(clean_steps_file).tmp,CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)$(newline)CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)$(newline)) 139*9e94795aSAndroid Build Coastguard Worker$(shell if ! cmp -s $(clean_steps_file).tmp $(clean_steps_file); then \ 140*9e94795aSAndroid Build Coastguard Worker mv $(clean_steps_file).tmp $(clean_steps_file); \ 141*9e94795aSAndroid Build Coastguard Worker else \ 142*9e94795aSAndroid Build Coastguard Worker rm $(clean_steps_file).tmp; \ 143*9e94795aSAndroid Build Coastguard Worker fi) 144*9e94795aSAndroid Build Coastguard Workerendif 145*9e94795aSAndroid Build Coastguard Worker 146*9e94795aSAndroid Build Coastguard WorkerCURRENT_CLEAN_BUILD_VERSION := 147*9e94795aSAndroid Build Coastguard WorkerCURRENT_CLEAN_STEPS := 148*9e94795aSAndroid Build Coastguard Workerclean_steps_file := 149*9e94795aSAndroid Build Coastguard WorkerINTERNAL_CLEAN_STEPS := 150*9e94795aSAndroid Build Coastguard WorkerINTERNAL_CLEAN_BUILD_VERSION := 151