# Copyright (C) 2007 The Android Open Source Project
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#

# If you don't need to do a full clean build but would like to touch
# a file or delete some intermediate files, add a clean step to the end
# of the list.  These steps will only be run once, if they haven't been
# run before.
#
# E.g.:
#     $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
#     $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
#
# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
# files that are missing or have been moved.
#
# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
# Use $(OUT_DIR) to refer to the "out" directory.
#
# If you need to re-do something that's already mentioned, just copy
# the command and add it to the bottom of the list.  E.g., if a change
# that you made last week required touching a file and a change you
# made today requires touching the same file, just copy the old
# touch step and add it to the end of the list.
#
# ************************************************
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
# ************************************************

# For example:
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/vold.fstab)
$(call add-clean-step, find $(OUT_DIR) -name "lights.msm8960*" -print0 | xargs -0 rm -f)
$(call add-clean-step, find $(OUT_DIR) -name "*.default.*so" -print0 | xargs -0 rm -f)
$(call add-clean-step, find $(PRODUCT_OUT) -name "*.prop" -print0 | xargs -0 rm -f)
$(call add-clean-step, find $(OUT_DIR) -name "wpa_supplicant*" -print0 | xargs -0 rm -f)
$(call add-clean-step, find $(PRODUCT_OUT) -name "*.img" -print0 | xargs -0 rm -f)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libhardware_legacy_intermediates/)
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/lib/modules/wlan.ko)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/recovery/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/recovery/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/recovery/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/mako/obj/EXECUTABLES/mm-vdec-omx-test*_intermediates)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/symbols/system/bin/mm-vdec-omx-test*)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/bin/mm-vdec-omx-test*)
$(call add-clean-step, rm -rf $(OUT_DIR)/target/product/mako/obj/EXECUTABLES/charger_touch_intermediates)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/symbols/system/bin/charger_touch)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/bin/charger_touch)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/obj/NOTICE_FILES/src/system/bin/charger_touch.txt)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/recovery/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/recovery/root/default.prop)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)

$(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/EXECUTABLES/alsaucm_test_intermediates \
                              $(PRODUCT_OUT)/obj/EXECUTABLES/amix_intermediates \
                              $(PRODUCT_OUT)/obj/EXECUTABLES/aplay_intermediates \
                              $(PRODUCT_OUT)/obj/EXECUTABLES/arec_intermediates \
                              $(PRODUCT_OUT)/obj/include/mm-audio \
                              $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/alsa.msm8960_intermediates \
                              $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/audio_policy.msm8960_intermediates \
                              $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/audio.primary.msm8960_intermediates \
                              $(PRODUCT_OUT)/obj/SHARED_LIBRARIES/libalsa-intf_intermediates \
                              $(PRODUCT_OUT)/obj/lib/libalsa-intf.so \
                              $(PRODUCT_OUT)/obj/lib/audio_policy.msm8960.so \
                              $(PRODUCT_OUT)/obj/lib/audio.primary.msm8960.so \
                              $(PRODUCT_OUT)/obj/lib/alsa.msm8960.so \
                              $(PRODUCT_OUT)/obj/NOTICE_FILES/src/system/lib/libalsa-intf.so.txt \
                              $(PRODUCT_OUT)/obj/NOTICE_FILES/src/system/lib/hw/audio_policy.msm8960.so.txt \
                              $(PRODUCT_OUT)/obj/NOTICE_FILES/src/system/lib/hw/audio.primary.msm8960.so.txt \
                              $(PRODUCT_OUT)/obj/NOTICE_FILES/src/system/lib/hw/alsa.msm8960.so.txt \
                              $(PRODUCT_OUT)/symbols/system/lib/libalsa-intf.so \
                              $(PRODUCT_OUT)/symbols/system/lib/hw/audio_policy.msm8960.so \
                              $(PRODUCT_OUT)/symbols/system/lib/hw/audio.primary.msm8960.so \
                              $(PRODUCT_OUT)/symbols/system/lib/hw/alsa.msm8960.so \
                              $(PRODUCT_OUT)/system/lib/libalsa-intf.so \
                              $(PRODUCT_OUT)/system/lib/hw/audio_policy.msm8960.so \
                              $(PRODUCT_OUT)/system/lib/hw/audio.primary.msm8960.so \
                              $(PRODUCT_OUT)/system/lib/hw/alsa.msm8960.so \
                              $(PRODUCT_OUT)/system/bin/amix \
                              $(PRODUCT_OUT)/system/bin/alsaucm_test \
                              $(PRODUCT_OUT)/system/bin/aplay \
                              $(PRODUCT_OUT)/system/bin/arec \
                              $(PRODUCT_OUT)/symbols/system/bin/amix \
                              $(PRODUCT_OUT)/symbols/system/bin/alsaucm_test \
                              $(PRODUCT_OUT)/symbols/system/bin/aplay \
                              $(PRODUCT_OUT)/symbols/system/bin/arec)
$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)

$(call add-clean-step, rm -f $(OUT_DIR)/target/product/mako/system/build.prop)

