blob: fa89758a4ac36d88e8761a8801c09dc9902d048d [file] [log] [blame]
The Android Open Source Project88b60792009-03-03 19:28:42 -08001# Copyright (C) 2007 The Android Open Source Project
2#
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
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
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.
14#
15
Ying Wang50e52fa2013-02-22 18:15:29 -080016# Don't bother with the cleanspecs if you are running mm/mmm
Ying Wangad7fd292013-08-08 16:34:29 -070017ifeq ($(ONE_SHOT_MAKEFILE)$(dont_bother),)
Ying Wang50e52fa2013-02-22 18:15:29 -080018
The Android Open Source Project88b60792009-03-03 19:28:42 -080019INTERNAL_CLEAN_STEPS :=
20
21# Builds up a list of clean steps. Creates a unique
Ying Wangfa9ae7b2010-03-03 10:45:14 -080022# id for each step by taking makefile path, INTERNAL_CLEAN_BUILD_VERSION
The Android Open Source Project88b60792009-03-03 19:28:42 -080023# and appending an increasing number of '@' characters.
24#
25# $(1): shell command to run
Ying Wangfa9ae7b2010-03-03 10:45:14 -080026# $(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.
The Android Open Source Project88b60792009-03-03 19:28:42 -080028define _add-clean-step
29 $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \
30 $(error INTERNAL_CLEAN_BUILD_VERSION not set))
Ying Wangfa9ae7b2010-03-03 10:45:14 -080031 $(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))))
The Android Open Source Project88b60792009-03-03 19:28:42 -080040 $(eval INTERNAL_CLEAN_STEPS += $(_acs_id))
41 $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1))
42 $(eval _acs_id :=)
Ying Wangfa9ae7b2010-03-03 10:45:14 -080043 $(eval _acs_makefile_prefix :=)
The Android Open Source Project88b60792009-03-03 19:28:42 -080044endef
45define add-clean-step
Ying Wangfa9ae7b2010-03-03 10:45:14 -080046$(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))))
The Android Open Source Project88b60792009-03-03 19:28:42 -080050endef
51
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.
Ying Wangfa9ae7b2010-03-03 10:45:14 -080055include $(BUILD_SYSTEM)/cleanspec.mk
The Android Open Source Project88b60792009-03-03 19:28:42 -080056INTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION))
Ying Wangeadaa952015-08-04 12:11:54 -070057INTERNAL_CLEAN_STEPS := $(strip $(INTERNAL_CLEAN_STEPS))
The Android Open Source Project88b60792009-03-03 19:28:42 -080058
59# If the clean_steps.mk file is missing (usually after a clean build)
60# then we won't do anything.
61CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)
62CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)
63
64# Read the current state from the file, if present.
65# Will set CURRENT_CLEAN_BUILD_VERSION and CURRENT_CLEAN_STEPS.
66#
67clean_steps_file := $(PRODUCT_OUT)/clean_steps.mk
68-include $(clean_steps_file)
69
70ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION))
71 # The major clean version is out-of-date. Do a full clean, and
72 # don't even bother with the clean steps.
73 $(info *** A clean build is required because of a recent change.)
74 $(shell rm -rf $(OUT_DIR))
75 $(info *** Done with the cleaning, now starting the real build.)
76else
77 # The major clean version is correct. Find the list of clean steps
78 # that we need to execute to get up-to-date.
79 steps := \
80 $(filter-out $(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_STEPS))
81 $(foreach step,$(steps), \
82 $(info Clean step: $(INTERNAL_CLEAN_STEP.$(step))) \
83 $(shell $(INTERNAL_CLEAN_STEP.$(step))) \
84 )
Ying Wangf6268b82014-06-18 12:07:48 -070085
86 # Rewrite the clean step for the second arch.
87 ifdef TARGET_2ND_ARCH
88 # $(1): the clean step cmd
89 # $(2): the prefix to search for
90 # $(3): the prefix to replace with
91 define -cs-rewrite-cleanstep
92 $(if $(filter $(2)/%,$(1)),\
93 $(eval _crs_new_cmd := $(patsubst $(2)/%,$(3)/%,$(1)))\
94 $(info Clean step: $(_crs_new_cmd))\
95 $(shell $(_crs_new_cmd)))
96 endef
97 $(foreach step,$(steps), \
98 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_INTERMEDIATES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES))\
99 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES))\
100 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES))\
101 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES),$(TARGET_OUT_INTERMEDIATES))\
102 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES),$(TARGET_OUT_SHARED_LIBRARIES))\
103 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES))\
104 )
105 endif
106 _crs_new_cmd :=
The Android Open Source Project88b60792009-03-03 19:28:42 -0800107 steps :=
108endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800109
110# Write the new state to the file.
Ying Wang50e52fa2013-02-22 18:15:29 -0800111#
Ying Wangeadaa952015-08-04 12:11:54 -0700112rewrite_clean_steps_file :=
Shinichiro Hamaji14da1422015-07-21 07:28:39 +0900113ifneq ($(CURRENT_CLEAN_BUILD_VERSION)-$(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_BUILD_VERSION)-$(INTERNAL_CLEAN_STEPS))
Ying Wangeadaa952015-08-04 12:11:54 -0700114rewrite_clean_steps_file := true
115endif
116ifeq ($(wildcard $(clean_steps_file)),)
117# This is the first build.
118rewrite_clean_steps_file := true
119endif
120ifeq ($(rewrite_clean_steps_file),true)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800121$(shell \
122 mkdir -p $(dir $(clean_steps_file)) && \
123 echo "CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)" > \
124 $(clean_steps_file) ;\
Shinichiro Hamaji1326f652016-01-27 14:59:56 +0900125 echo "CURRENT_CLEAN_STEPS := $(wordlist 1,500,$(INTERNAL_CLEAN_STEPS))" >> $(clean_steps_file) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800126 )
Shinichiro Hamaji1326f652016-01-27 14:59:56 +0900127define -cs-write-clean-steps-if-arg1-not-empty
128$(if $(1),$(shell echo "CURRENT_CLEAN_STEPS += $(1)" >> $(clean_steps_file)))
129endef
130$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 501,1000,$(INTERNAL_CLEAN_STEPS)))
131$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1001,1500,$(INTERNAL_CLEAN_STEPS)))
132$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 1501,2000,$(INTERNAL_CLEAN_STEPS)))
133$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2001,2500,$(INTERNAL_CLEAN_STEPS)))
134$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 2501,3000,$(INTERNAL_CLEAN_STEPS)))
135$(call -cs-write-clean-steps-if-arg1-not-empty,$(wordlist 3001,99999,$(INTERNAL_CLEAN_STEPS)))
Shinichiro Hamaji14da1422015-07-21 07:28:39 +0900136endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800137
Shinichiro Hamaji14da1422015-07-21 07:28:39 +0900138CURRENT_CLEAN_BUILD_VERSION :=
139CURRENT_CLEAN_STEPS :=
The Android Open Source Project88b60792009-03-03 19:28:42 -0800140clean_steps_file :=
Ying Wangeadaa952015-08-04 12:11:54 -0700141rewrite_clean_steps_file :=
The Android Open Source Project88b60792009-03-03 19:28:42 -0800142INTERNAL_CLEAN_STEPS :=
143INTERNAL_CLEAN_BUILD_VERSION :=
144
Ying Wangad7fd292013-08-08 16:34:29 -0700145endif # if not ONE_SHOT_MAKEFILE dont_bother
The Android Open Source Project88b60792009-03-03 19:28:42 -0800146
147# Since products and build variants (unfortunately) share the same
148# PRODUCT_OUT staging directory, things can get out of sync if different
149# build configurations are built in the same tree. The following logic
150# will notice when the configuration has changed and remove the files
151# necessary to keep things consistent.
152
153previous_build_config_file := $(PRODUCT_OUT)/previous_build_config.mk
Dan Willemsen2cfbdf42016-09-16 10:03:22 -0700154current_build_config_file := $(PRODUCT_OUT)/current_build_config.mk
The Android Open Source Project88b60792009-03-03 19:28:42 -0800155
The Android Open Source Project88b60792009-03-03 19:28:42 -0800156current_build_config := \
Dan Willemsen832932f2016-07-31 15:47:17 -0700157 $(TARGET_PRODUCT)-$(TARGET_BUILD_VARIANT)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800158force_installclean := false
159
160# Read the current state from the file, if present.
161# Will set PREVIOUS_BUILD_CONFIG.
162#
163PREVIOUS_BUILD_CONFIG :=
164-include $(previous_build_config_file)
165PREVIOUS_BUILD_CONFIG := $(strip $(PREVIOUS_BUILD_CONFIG))
Evgenii Stepanova36223e2015-06-11 17:36:06 -0700166
The Android Open Source Project88b60792009-03-03 19:28:42 -0800167ifdef PREVIOUS_BUILD_CONFIG
Colin Cross63fe36a2017-02-21 17:23:02 -0800168 ifneq ($(current_build_config),$(PREVIOUS_BUILD_CONFIG))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800169 $(info *** Build configuration changed: "$(PREVIOUS_BUILD_CONFIG)" -> "$(current_build_config)")
170 ifneq ($(DISABLE_AUTO_INSTALLCLEAN),true)
171 force_installclean := true
172 else
173 $(info DISABLE_AUTO_INSTALLCLEAN is set; skipping auto-clean. Your tree may be in an inconsistent state.)
174 endif
175 endif
176endif # else, this is the first build, so no need to clean.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800177
178# Write the new state to the file.
179#
180$(shell \
Dan Willemsen2cfbdf42016-09-16 10:03:22 -0700181 mkdir -p $(dir $(current_build_config_file)) && \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800182 echo "PREVIOUS_BUILD_CONFIG := $(current_build_config)" > \
Dan Willemsen2cfbdf42016-09-16 10:03:22 -0700183 $(current_build_config_file) \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800184 )
Dan Willemsen2cfbdf42016-09-16 10:03:22 -0700185$(shell cmp $(current_build_config_file) $(previous_build_config_file) > /dev/null 2>&1 || \
186 mv -f $(current_build_config_file) $(previous_build_config_file))
187
Shinichiro Hamaji14da1422015-07-21 07:28:39 +0900188PREVIOUS_BUILD_CONFIG :=
The Android Open Source Project88b60792009-03-03 19:28:42 -0800189previous_build_config_file :=
Dan Willemsen2cfbdf42016-09-16 10:03:22 -0700190current_build_config_file :=
The Android Open Source Project88b60792009-03-03 19:28:42 -0800191current_build_config :=
192
193#
194# installclean logic
195#
196
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800197# The files/dirs to delete during an installclean.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800198#
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800199# Deletes all of the installed files -- the intent is to remove files
200# that may no longer be installed, either because the user previously
201# installed them, or they were previously installed by default but no
202# longer are.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800203#
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800204# This is faster than a full clean, since we're not deleting the
205# intermediates. Instead of recompiling, we can just copy the results.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800206#
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800207# Host bin, frameworks, and lib* are intentionally omitted, since
208# otherwise we'd have to rebuild any generated files created with those
209# tools.
The Android Open Source Project88b60792009-03-03 19:28:42 -0800210installclean_files := \
Ying Wang096bb3d2011-01-04 12:55:14 -0800211 $(HOST_OUT)/obj/NOTICE_FILES \
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800212 $(HOST_OUT)/obj/PACKAGING \
213 $(HOST_OUT)/coverage \
214 $(HOST_OUT)/cts \
215 $(HOST_OUT)/nativetest* \
Ying Wang096bb3d2011-01-04 12:55:14 -0800216 $(HOST_OUT)/sdk \
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800217 $(HOST_OUT)/sdk_addon \
218 $(HOST_OUT)/testcases \
219 $(HOST_OUT)/vts \
220 $(HOST_CROSS_OUT)/bin \
221 $(HOST_CROSS_OUT)/coverage \
222 $(HOST_CROSS_OUT)/lib* \
223 $(HOST_CROSS_OUT)/nativetest* \
Ying Wang096bb3d2011-01-04 12:55:14 -0800224 $(PRODUCT_OUT)/*.img \
Ji-Hwan Lee0a5b1782014-05-15 20:59:01 +0900225 $(PRODUCT_OUT)/*.ini \
Ying Wang096bb3d2011-01-04 12:55:14 -0800226 $(PRODUCT_OUT)/*.txt \
227 $(PRODUCT_OUT)/*.xlb \
228 $(PRODUCT_OUT)/*.zip \
Ying Wang949c4eb2013-08-01 15:41:53 -0700229 $(PRODUCT_OUT)/kernel \
Ying Wang096bb3d2011-01-04 12:55:14 -0800230 $(PRODUCT_OUT)/data \
Ji-Hwan Lee0a5b1782014-05-15 20:59:01 +0900231 $(PRODUCT_OUT)/skin \
Ying Wang096bb3d2011-01-04 12:55:14 -0800232 $(PRODUCT_OUT)/obj/NOTICE_FILES \
233 $(PRODUCT_OUT)/obj/PACKAGING \
234 $(PRODUCT_OUT)/recovery \
235 $(PRODUCT_OUT)/root \
236 $(PRODUCT_OUT)/system \
Alex Light4e358ab2016-06-16 14:47:10 -0700237 $(PRODUCT_OUT)/system_other \
Ying Wang42218732014-07-18 09:56:13 -0700238 $(PRODUCT_OUT)/vendor \
239 $(PRODUCT_OUT)/oem \
Dan Willemsenf61e80b2017-02-10 16:44:10 -0800240 $(PRODUCT_OUT)/obj/FAKE \
241 $(PRODUCT_OUT)/breakpad \
242 $(PRODUCT_OUT)/cache \
243 $(PRODUCT_OUT)/coverage \
244 $(PRODUCT_OUT)/installer \
245 $(PRODUCT_OUT)/odm \
246 $(PRODUCT_OUT)/sysloader \
247 $(PRODUCT_OUT)/testcases \
The Android Open Source Project88b60792009-03-03 19:28:42 -0800248
249# The files/dirs to delete during a dataclean, which removes any files
250# in the staging and emulator data partitions.
251dataclean_files := \
Ying Wang096bb3d2011-01-04 12:55:14 -0800252 $(PRODUCT_OUT)/data/* \
253 $(PRODUCT_OUT)/data-qemu/* \
254 $(PRODUCT_OUT)/userdata-qemu.img
255
256# make sure *_OUT is set so that we won't result in deleting random parts
257# of the filesystem.
258ifneq (2,$(words $(HOST_OUT) $(PRODUCT_OUT)))
259 $(error both HOST_OUT and PRODUCT_OUT should be set at this point.)
260endif
The Android Open Source Project88b60792009-03-03 19:28:42 -0800261
262# Define the rules for commandline invocation.
263.PHONY: dataclean
264dataclean: FILES := $(dataclean_files)
265dataclean:
266 $(hide) rm -rf $(FILES)
267 @echo "Deleted emulator userdata images."
268
269.PHONY: installclean
270installclean: FILES := $(installclean_files)
271installclean: dataclean
272 $(hide) rm -rf $(FILES)
273 @echo "Deleted images and staging directories."
274
Colin Cross63fe36a2017-02-21 17:23:02 -0800275ifeq ($(force_installclean),true)
The Android Open Source Project88b60792009-03-03 19:28:42 -0800276 $(info *** Forcing "make installclean"...)
Ying Wang096bb3d2011-01-04 12:55:14 -0800277 $(info *** rm -rf $(dataclean_files) $(installclean_files))
The Android Open Source Project88b60792009-03-03 19:28:42 -0800278 $(shell rm -rf $(dataclean_files) $(installclean_files))
279 $(info *** Done with the cleaning, now starting the real build.)
280endif
281force_installclean :=
Yohann Rousself09e59e2014-09-08 14:45:14 +0200282
Ying Wangd37b5402015-04-14 14:10:46 -0700283###########################################################
Ying Wangd37b5402015-04-14 14:10:46 -0700284
Yohann Rousself09e59e2014-09-08 14:45:14 +0200285.PHONY: clean-jack-files
286clean-jack-files: clean-dex-files
287 $(hide) find $(OUT_DIR) -name "*.jack" | xargs rm -f
288 $(hide) find $(OUT_DIR) -type d -name "jack" | xargs rm -rf
289 @echo "All jack files have been removed."
290
291.PHONY: clean-dex-files
292clean-dex-files:
293 $(hide) find $(OUT_DIR) -name "*.dex" ! -path "*/jack-incremental/*" | xargs rm -f
294 $(hide) for i in `find $(OUT_DIR) -name "*.jar" -o -name "*.apk"` ; do ((unzip -l $$i 2> /dev/null | \
295 grep -q "\.dex$$" && rm -f $$i) || continue ) ; done
296 @echo "All dex files and archives containing dex files have been removed."
297
298.PHONY: clean-jack-incremental
299clean-jack-incremental:
300 $(hide) find $(OUT_DIR) -name "jack-incremental" -type d | xargs rm -rf
301 @echo "All jack incremental dirs have been removed."