1 # Copyright (C) 2007 The Android Open Source Project
3 # Licensed under the Apache License, Version 2.0 (the "License");
4 # you may not use this file except in compliance with the License.
5 # You may obtain a copy of the License at
7 # http://www.apache.org/licenses/LICENSE-2.0
9 # Unless required by applicable law or agreed to in writing, software
10 # distributed under the License is distributed on an "AS IS" BASIS,
11 # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 # See the License for the specific language governing permissions and
13 # limitations under the License.
16 INTERNAL_CLEAN_STEPS :=
18 # Builds up a list of clean steps. Creates a unique
19 # id for each step by taking makefile path, INTERNAL_CLEAN_BUILD_VERSION
20 # and appending an increasing number of '@' characters.
22 # $(1): shell command to run
23 # $(2): indicate to not use makefile path as part of step id if not empty.
24 # $(2) should only be used in build/core/cleanspec.mk: just for compatibility.
25 define _add-clean-step
26 $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \
27 $(error INTERNAL_CLEAN_BUILD_VERSION not set))
28 $(eval _acs_makefile_prefix := $(lastword $(MAKEFILE_LIST)))
29 $(eval _acs_makefile_prefix := $(subst /,_,$(_acs_makefile_prefix)))
30 $(eval _acs_makefile_prefix := $(subst .,-,$(_acs_makefile_prefix)))
31 $(eval _acs_makefile_prefix := $(_acs_makefile_prefix)_acs)
32 $(if $($(_acs_makefile_prefix)),,\
33 $(eval $(_acs_makefile_prefix) := $(INTERNAL_CLEAN_BUILD_VERSION)))
34 $(eval $(_acs_makefile_prefix) := $($(_acs_makefile_prefix))@)
35 $(if $(strip $(2)),$(eval _acs_id := $($(_acs_makefile_prefix))),\
36 $(eval _acs_id := $(_acs_makefile_prefix)$($(_acs_makefile_prefix))))
37 $(eval INTERNAL_CLEAN_STEPS += $(_acs_id))
38 $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1))
40 $(eval _acs_makefile_prefix :=)
43 $(eval # for build/core/cleanspec.mk, dont use makefile path as part of step id) \
44 $(if $(filter %/cleanspec.mk,$(lastword $(MAKEFILE_LIST))),\
45 $(eval $(call _add-clean-step,$(1),true)),\
46 $(eval $(call _add-clean-step,$(1))))
49 # Defines INTERNAL_CLEAN_BUILD_VERSION and the individual clean steps.
50 # cleanspec.mk is outside of the core directory so that more people
51 # can have permission to touch it.
52 include $(BUILD_SYSTEM)/cleanspec.mk
53 INTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION))
55 # If the clean_steps.mk file is missing (usually after a clean build)
56 # then we won't do anything.
57 CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)
58 CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)
60 # Read the current state from the file, if present.
61 # Will set CURRENT_CLEAN_BUILD_VERSION and CURRENT_CLEAN_STEPS.
63 clean_steps_file := $(PRODUCT_OUT)/clean_steps.mk
64 -include $(clean_steps_file)
66 ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION))
67 # The major clean version is out-of-date. Do a full clean, and
68 # don't even bother with the clean steps.
69 $(info *** A clean build is required because of a recent change.)
70 $(shell rm -rf $(OUT_DIR))
71 $(info *** Done with the cleaning, now starting the real build.)
73 # The major clean version is correct. Find the list of clean steps
74 # that we need to execute to get up-to-date.
76 $(filter-out $(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_STEPS))
77 $(foreach step,$(steps), \
78 $(info Clean step: $(INTERNAL_CLEAN_STEP.$(step))) \
79 $(shell $(INTERNAL_CLEAN_STEP.$(step))) \
81 # If we are running mm/mmm, we should copy over the other clean steps too.
82 ifneq ($(ONE_SHOT_MAKEFILE),)
83 INTERNAL_CLEAN_STEPS := $(strip $(CURRENT_CLEAN_STEPS) $(steps))
87 CURRENT_CLEAN_BUILD_VERSION :=
88 CURRENT_CLEAN_STEPS :=
90 # Write the new state to the file.
91 # Don't write the file if we are running mm/mmm but without a preexisting clean_steps_file.
92 ifneq (,$(wildcard $(clean_steps_file))$(filter ||,|$(ONE_SHOT_MAKEFILE)|))
94 mkdir -p $(dir $(clean_steps_file)) && \
95 echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \
96 $(clean_steps_file) ;\
97 echo "CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)" >> \
103 INTERNAL_CLEAN_STEPS :=
104 INTERNAL_CLEAN_BUILD_VERSION :=
107 # Since products and build variants (unfortunately) share the same
108 # PRODUCT_OUT staging directory, things can get out of sync if different
109 # build configurations are built in the same tree. The following logic
110 # will notice when the configuration has changed and remove the files
111 # necessary to keep things consistent.
113 previous_build_config_file := $(PRODUCT_OUT)/previous_build_config.mk
115 # TODO: this special case for the sdk is only necessary while "sdk"
116 # is a valid make target. Eventually, it will just be a product, at
117 # which point TARGET_PRODUCT will handle it and we can avoid this check
118 # of MAKECMDGOALS. The "addprefix" is just to keep things pretty.
119 ifneq ($(TARGET_PRODUCT),sdk)
120 building_sdk := $(addprefix -,$(filter sdk,$(MAKECMDGOALS)))
122 # Don't bother with this extra part when explicitly building the sdk product.
126 # A change in the list of aapt configs warrants an installclean, too.
127 aapt_config_list := $(strip $(PRODUCT_AAPT_CONFIG) $(PRODUCT_AAPT_PREF_CONFIG))
129 current_build_config := \
130 $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)$(building_sdk)-{$(aapt_config_list)}
133 force_installclean := false
135 # Read the current state from the file, if present.
136 # Will set PREVIOUS_BUILD_CONFIG.
138 PREVIOUS_BUILD_CONFIG :=
139 -include $(previous_build_config_file)
140 PREVIOUS_BUILD_CONFIG := $(strip $(PREVIOUS_BUILD_CONFIG))
141 ifdef PREVIOUS_BUILD_CONFIG
142 ifneq "$(current_build_config)" "$(PREVIOUS_BUILD_CONFIG)"
143 $(info *** Build configuration changed: "$(PREVIOUS_BUILD_CONFIG)" -> "$(current_build_config)")
144 ifneq ($(DISABLE_AUTO_INSTALLCLEAN),true)
145 force_installclean := true
147 $(info DISABLE_AUTO_INSTALLCLEAN is set; skipping auto-clean. Your tree may be in an inconsistent state.)
150 endif # else, this is the first build, so no need to clean.
151 PREVIOUS_BUILD_CONFIG :=
153 # Write the new state to the file.
156 mkdir -p $(dir $(previous_build_config_file)) && \
157 echo "PREVIOUS_BUILD_CONFIG := $(current_build_config)" > \
158 $(previous_build_config_file) \
160 previous_build_config_file :=
161 current_build_config :=
167 # The files/dirs to delete during an installclean. This includes the
168 # non-common APPS directory, which may contain the wrong resources.
170 # Deletes all of the files that change between different build types,
171 # like "make user" vs. "make sdk". This lets you work with different
172 # build types without having to do a full clean each time. E.g.:
175 # $ make installclean
177 # $ make installclean
180 installclean_files := \
181 $(HOST_OUT)/obj/NOTICE_FILES \
183 $(PRODUCT_OUT)/*.img \
184 $(PRODUCT_OUT)/*.txt \
185 $(PRODUCT_OUT)/*.xlb \
186 $(PRODUCT_OUT)/*.zip \
187 $(PRODUCT_OUT)/data \
188 $(PRODUCT_OUT)/obj/APPS \
189 $(PRODUCT_OUT)/obj/NOTICE_FILES \
190 $(PRODUCT_OUT)/obj/PACKAGING \
191 $(PRODUCT_OUT)/recovery \
192 $(PRODUCT_OUT)/root \
193 $(PRODUCT_OUT)/system \
194 $(PRODUCT_OUT)/dex_bootjars \
195 $(PRODUCT_OUT)/obj/JAVA_LIBRARIES \
196 $(PRODUCT_OUT)/obj/FAKE \
197 $(PRODUCT_OUT)/obj/EXECUTABLES/adbd_intermediates \
198 $(PRODUCT_OUT)/obj/EXECUTABLES/init_intermediates
201 # The files/dirs to delete during a dataclean, which removes any files
202 # in the staging and emulator data partitions.
204 $(PRODUCT_OUT)/data/* \
205 $(PRODUCT_OUT)/data-qemu/* \
206 $(PRODUCT_OUT)/userdata-qemu.img
208 # make sure *_OUT is set so that we won't result in deleting random parts
210 ifneq (2,$(words $(HOST_OUT) $(PRODUCT_OUT)))
211 $(error both HOST_OUT and PRODUCT_OUT should be set at this point.)
214 # Define the rules for commandline invocation.
216 dataclean: FILES := $(dataclean_files)
218 $(hide) rm -rf $(FILES)
219 @echo "Deleted emulator userdata images."
222 installclean: FILES := $(installclean_files)
223 installclean: dataclean
224 $(hide) rm -rf $(FILES)
225 @echo "Deleted images and staging directories."
227 ifeq "$(force_installclean)" "true"
228 $(info *** Forcing "make installclean"...)
229 $(info *** rm -rf $(dataclean_files) $(installclean_files))
230 $(shell rm -rf $(dataclean_files) $(installclean_files))
231 $(info *** Done with the cleaning, now starting the real build.)
233 force_installclean :=