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 # Don't bother with the cleanspecs if you are running mm/mmm
17 ifeq ($(ONE_SHOT_MAKEFILE)$(dont_bother),)
19 INTERNAL_CLEAN_STEPS :=
21 # Builds up a list of clean steps. Creates a unique
22 # id for each step by taking makefile path, INTERNAL_CLEAN_BUILD_VERSION
23 # and appending an increasing number of '@' characters.
25 # $(1): shell command to run
26 # $(2): indicate to not use makefile path as part of step id if not empty.
27 # $(2) should only be used in build/core/cleanspec.mk: just for compatibility.
28 define _add-clean-step
29 $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \
30 $(error INTERNAL_CLEAN_BUILD_VERSION not set))
31 $(eval _acs_makefile_prefix := $(lastword $(MAKEFILE_LIST)))
32 $(eval _acs_makefile_prefix := $(subst /,_,$(_acs_makefile_prefix)))
33 $(eval _acs_makefile_prefix := $(subst .,-,$(_acs_makefile_prefix)))
34 $(eval _acs_makefile_prefix := $(_acs_makefile_prefix)_acs)
35 $(if $($(_acs_makefile_prefix)),,\
36 $(eval $(_acs_makefile_prefix) := $(INTERNAL_CLEAN_BUILD_VERSION)))
37 $(eval $(_acs_makefile_prefix) := $($(_acs_makefile_prefix))@)
38 $(if $(strip $(2)),$(eval _acs_id := $($(_acs_makefile_prefix))),\
39 $(eval _acs_id := $(_acs_makefile_prefix)$($(_acs_makefile_prefix))))
40 $(eval INTERNAL_CLEAN_STEPS += $(_acs_id))
41 $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1))
43 $(eval _acs_makefile_prefix :=)
46 $(eval # for build/core/cleanspec.mk, dont use makefile path as part of step id) \
47 $(if $(filter %/cleanspec.mk,$(lastword $(MAKEFILE_LIST))),\
48 $(eval $(call _add-clean-step,$(1),true)),\
49 $(eval $(call _add-clean-step,$(1))))
52 # Defines INTERNAL_CLEAN_BUILD_VERSION and the individual clean steps.
53 # cleanspec.mk is outside of the core directory so that more people
54 # can have permission to touch it.
55 include $(BUILD_SYSTEM)/cleanspec.mk
56 INTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION))
58 # If the clean_steps.mk file is missing (usually after a clean build)
59 # then we won't do anything.
60 CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)
61 CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)
63 # Read the current state from the file, if present.
64 # Will set CURRENT_CLEAN_BUILD_VERSION and CURRENT_CLEAN_STEPS.
66 clean_steps_file := $(PRODUCT_OUT)/clean_steps.mk
67 -include $(clean_steps_file)
69 ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION))
70 # The major clean version is out-of-date. Do a full clean, and
71 # don't even bother with the clean steps.
72 $(info *** A clean build is required because of a recent change.)
73 $(shell rm -rf $(OUT_DIR))
74 $(info *** Done with the cleaning, now starting the real build.)
76 # The major clean version is correct. Find the list of clean steps
77 # that we need to execute to get up-to-date.
79 $(filter-out $(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_STEPS))
80 $(foreach step,$(steps), \
81 $(info Clean step: $(INTERNAL_CLEAN_STEP.$(step))) \
82 $(shell $(INTERNAL_CLEAN_STEP.$(step))) \
85 # Rewrite the clean step for the second arch.
87 # $(1): the clean step cmd
88 # $(2): the prefix to search for
89 # $(3): the prefix to replace with
90 define -cs-rewrite-cleanstep
91 $(if $(filter $(2)/%,$(1)),\
92 $(eval _crs_new_cmd := $(patsubst $(2)/%,$(3)/%,$(1)))\
93 $(info Clean step: $(_crs_new_cmd))\
94 $(shell $(_crs_new_cmd)))
96 $(foreach step,$(steps), \
97 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_INTERMEDIATES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES))\
98 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES))\
99 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES))\
100 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES),$(TARGET_OUT_INTERMEDIATES))\
101 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES),$(TARGET_OUT_SHARED_LIBRARIES))\
102 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES))\
108 CURRENT_CLEAN_BUILD_VERSION :=
109 CURRENT_CLEAN_STEPS :=
111 # Write the new state to the file.
114 mkdir -p $(dir $(clean_steps_file)) && \
115 echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \
116 $(clean_steps_file) ;\
117 echo "CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)" >> \
118 $(clean_steps_file) \
122 INTERNAL_CLEAN_STEPS :=
123 INTERNAL_CLEAN_BUILD_VERSION :=
125 endif # if not ONE_SHOT_MAKEFILE dont_bother
127 # Since products and build variants (unfortunately) share the same
128 # PRODUCT_OUT staging directory, things can get out of sync if different
129 # build configurations are built in the same tree. The following logic
130 # will notice when the configuration has changed and remove the files
131 # necessary to keep things consistent.
133 previous_build_config_file := $(PRODUCT_OUT)/previous_build_config.mk
135 # A change in the list of aapt configs warrants an installclean, too.
136 aapt_config_list := $(strip $(PRODUCT_AAPT_CONFIG) $(PRODUCT_AAPT_PREF_CONFIG))
138 current_build_config := \
139 $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)-{$(aapt_config_list)}
141 force_installclean := false
143 # Read the current state from the file, if present.
144 # Will set PREVIOUS_BUILD_CONFIG.
146 PREVIOUS_BUILD_CONFIG :=
147 -include $(previous_build_config_file)
148 PREVIOUS_BUILD_CONFIG := $(strip $(PREVIOUS_BUILD_CONFIG))
149 ifdef PREVIOUS_BUILD_CONFIG
150 ifneq "$(current_build_config)" "$(PREVIOUS_BUILD_CONFIG)"
151 $(info *** Build configuration changed: "$(PREVIOUS_BUILD_CONFIG)" -> "$(current_build_config)")
152 ifneq ($(DISABLE_AUTO_INSTALLCLEAN),true)
153 force_installclean := true
155 $(info DISABLE_AUTO_INSTALLCLEAN is set; skipping auto-clean. Your tree may be in an inconsistent state.)
158 endif # else, this is the first build, so no need to clean.
159 PREVIOUS_BUILD_CONFIG :=
161 # Write the new state to the file.
164 mkdir -p $(dir $(previous_build_config_file)) && \
165 echo "PREVIOUS_BUILD_CONFIG := $(current_build_config)" > \
166 $(previous_build_config_file) \
168 previous_build_config_file :=
169 current_build_config :=
175 # The files/dirs to delete during an installclean. This includes the
176 # non-common APPS directory, which may contain the wrong resources.
178 # Deletes all of the files that change between different build types,
179 # like "make user" vs. "make sdk". This lets you work with different
180 # build types without having to do a full clean each time. E.g.:
183 # $ make installclean
185 # $ make installclean
188 installclean_files := \
189 $(HOST_OUT)/obj/NOTICE_FILES \
191 $(PRODUCT_OUT)/*.img \
192 $(PRODUCT_OUT)/*.ini \
193 $(PRODUCT_OUT)/*.txt \
194 $(PRODUCT_OUT)/*.xlb \
195 $(PRODUCT_OUT)/*.zip \
196 $(PRODUCT_OUT)/kernel \
197 $(PRODUCT_OUT)/data \
198 $(PRODUCT_OUT)/skin \
199 $(PRODUCT_OUT)/obj/APPS \
200 $(PRODUCT_OUT)/obj/NOTICE_FILES \
201 $(PRODUCT_OUT)/obj/PACKAGING \
202 $(PRODUCT_OUT)/recovery \
203 $(PRODUCT_OUT)/root \
204 $(PRODUCT_OUT)/system \
205 $(PRODUCT_OUT)/vendor \
207 $(PRODUCT_OUT)/dex_bootjars \
208 $(PRODUCT_OUT)/obj/JAVA_LIBRARIES \
209 $(PRODUCT_OUT)/obj/FAKE \
210 $(PRODUCT_OUT)/obj/EXECUTABLES/adbd_intermediates \
211 $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libfs_mgr_intermediates \
212 $(PRODUCT_OUT)/obj/EXECUTABLES/init_intermediates \
213 $(PRODUCT_OUT)/obj/ETC/mac_permissions.xml_intermediates \
214 $(PRODUCT_OUT)/obj/ETC/sepolicy_intermediates \
215 $(PRODUCT_OUT)/obj/ETC/init.environ.rc_intermediates
217 # The files/dirs to delete during a dataclean, which removes any files
218 # in the staging and emulator data partitions.
220 $(PRODUCT_OUT)/data/* \
221 $(PRODUCT_OUT)/data-qemu/* \
222 $(PRODUCT_OUT)/userdata-qemu.img
224 # make sure *_OUT is set so that we won't result in deleting random parts
226 ifneq (2,$(words $(HOST_OUT) $(PRODUCT_OUT)))
227 $(error both HOST_OUT and PRODUCT_OUT should be set at this point.)
230 # Define the rules for commandline invocation.
232 dataclean: FILES := $(dataclean_files)
234 $(hide) rm -rf $(FILES)
235 @echo "Deleted emulator userdata images."
238 installclean: FILES := $(installclean_files)
239 installclean: dataclean
240 $(hide) rm -rf $(FILES)
241 @echo "Deleted images and staging directories."
243 ifeq "$(force_installclean)" "true"
244 $(info *** Forcing "make installclean"...)
245 $(info *** rm -rf $(dataclean_files) $(installclean_files))
246 $(shell rm -rf $(dataclean_files) $(installclean_files))
247 $(info *** Done with the cleaning, now starting the real build.)
249 force_installclean :=
251 ###########################################################
252 # Clean build tools when swithcing between prebuilt host tools (such as in
253 # apps_only build) and tools built from source (platform build).
254 previous_prebuilt_tools_config_file := $(HOST_OUT)/previous_prebuilt_tools_config.mk
255 ifneq (,$(TARGET_BUILD_APPS)$(filter true,$(TARGET_BUILD_PDK)))
256 current_prebuilt_tools := true
258 current_prebuilt_tools := false
260 PREVIOUS_PREBUILT_TOOLS :=
261 -include $(previous_prebuilt_tools_config_file)
263 ifdef PREVIOUS_PREBUILT_TOOLS
264 ifneq ($(PREVIOUS_PREBUILT_TOOLS),$(current_prebuilt_tools))
265 force_tools_clean := true
267 endif # else, this is the first build, so no need to clean.
269 # Write the new state to the file.
271 mkdir -p $(dir $(previous_prebuilt_tools_config_file)) && \
272 echo "PREVIOUS_PREBUILT_TOOLS:=$(current_prebuilt_tools)" > \
273 $(previous_prebuilt_tools_config_file))
275 ifeq ($(force_tools_clean),true)
276 # For this list of prebuilt tools, see prebuilts/sdk/tools/Android.mk.
277 tools_clean_files := \
278 $(HOST_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/signapk_intermediates \
279 $(HOST_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/dx_intermediates \
280 $(HOST_OUT_COMMON_INTERMEDIATES)/JAVA_LIBRARIES/shrinkedAndroid_intermediates \
281 $(HOST_OUT)/obj*/EXECUTABLES/aapt_intermediates \
282 $(HOST_OUT)/obj*/EXECUTABLES/aidl_intermediates \
283 $(HOST_OUT)/obj*/EXECUTABLES/zipalign_intermediates \
284 $(HOST_OUT)/obj*/lib/libc++$(HOST_SHLIB_SUFFIX) \
286 $(info *** build type changed, clean host tools...)
287 $(info *** rm -rf $(tools_clean_files))
288 $(shell rm -rf $(tools_clean_files))
291 ###########################################################
293 .PHONY: clean-jack-files
294 clean-jack-files: clean-dex-files
295 $(hide) find $(OUT_DIR) -name "*.jack" | xargs rm -f
296 $(hide) find $(OUT_DIR) -type d -name "jack" | xargs rm -rf
297 @echo "All jack files have been removed."
299 .PHONY: clean-dex-files
301 $(hide) find $(OUT_DIR) -name "*.dex" ! -path "*/jack-incremental/*" | xargs rm -f
302 $(hide) for i in `find $(OUT_DIR) -name "*.jar" -o -name "*.apk"` ; do ((unzip -l $$i 2> /dev/null | \
303 grep -q "\.dex$$" && rm -f $$i) || continue ) ; done
304 @echo "All dex files and archives containing dex files have been removed."
306 .PHONY: clean-jack-incremental
307 clean-jack-incremental:
308 $(hide) find $(OUT_DIR) -name "jack-incremental" -type d | xargs rm -rf
309 @echo "All jack incremental dirs have been removed."