xref: /aosp_15_r20/build/make/core/cleanbuild.mk (revision 9e94795a3d4ef5c1d47486f9a02bb378756cea8a)
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