1 # 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 16 # Absolute path of the present working direcotry. 17 # This overrides the shell variable $PWD, which does not necessarily points to 18 # the top of the source tree, for example when "make -C" is used in m/mm/mmm. 19 PWD := $(shell pwd) 20 21 TOP := . 22 TOPDIR := 23 24 BUILD_SYSTEM := $(TOPDIR)build/make/core 25 26 # Set up various standard variables based on configuration 27 # and host information. 28 include $(BUILD_SYSTEM)/config.mk 29 30 include $(SOONG_MAKEVARS_MK) 31 32 include $(BUILD_SYSTEM)/clang/config.mk 33 34 # CTS-specific config. 35 -include cts/build/config.mk 36 # VTS-specific config. 37 -include test/vts/tools/vts-tradefed/build/config.mk 38 # device-tests-specific-config. 39 -include tools/tradefederation/build/suites/device-tests/config.mk 40 # general-tests-specific-config. 41 -include tools/tradefederation/build/suites/general-tests/config.mk 42 43 INTERNAL_CLEAN_STEPS := 44 45 # Builds up a list of clean steps. Creates a unique 46 # id for each step by taking makefile path, INTERNAL_CLEAN_BUILD_VERSION 47 # and appending an increasing number of '@' characters. 48 # 49 # $(1): shell command to run 50 # $(2): indicate to not use makefile path as part of step id if not empty. 51 # $(2) should only be used in build/make/core/cleanspec.mk: just for compatibility. 52 define _add-clean-step 53 $(if $(strip $(INTERNAL_CLEAN_BUILD_VERSION)),, \ 54 $(error INTERNAL_CLEAN_BUILD_VERSION not set)) 55 $(eval _acs_makefile_prefix := $(lastword $(MAKEFILE_LIST))) 56 $(eval _acs_makefile_prefix := $(subst /,_,$(_acs_makefile_prefix))) 57 $(eval _acs_makefile_prefix := $(subst .,-,$(_acs_makefile_prefix))) 58 $(eval _acs_makefile_prefix := $(_acs_makefile_prefix)_acs) 59 $(if $($(_acs_makefile_prefix)),,\ 60 $(eval $(_acs_makefile_prefix) := $(INTERNAL_CLEAN_BUILD_VERSION))) 61 $(eval $(_acs_makefile_prefix) := $($(_acs_makefile_prefix))@) 62 $(if $(strip $(2)),$(eval _acs_id := $($(_acs_makefile_prefix))),\ 63 $(eval _acs_id := $(_acs_makefile_prefix)$($(_acs_makefile_prefix)))) 64 $(eval INTERNAL_CLEAN_STEPS += $(_acs_id)) 65 $(eval INTERNAL_CLEAN_STEP.$(_acs_id) := $(1)) 66 $(eval _acs_id :=) 67 $(eval _acs_makefile_prefix :=) 68 endef 69 define add-clean-step 70 $(eval # for build/make/core/cleanspec.mk, dont use makefile path as part of step id) \ 71 $(if $(filter %/cleanspec.mk,$(lastword $(MAKEFILE_LIST))),\ 72 $(eval $(call _add-clean-step,$(1),true)),\ 73 $(eval $(call _add-clean-step,$(1)))) 74 endef 75 76 # Defines INTERNAL_CLEAN_BUILD_VERSION and the individual clean steps. 77 # cleanspec.mk is outside of the core directory so that more people 78 # can have permission to touch it. 79 include $(BUILD_SYSTEM)/cleanspec.mk 80 INTERNAL_CLEAN_BUILD_VERSION := $(strip $(INTERNAL_CLEAN_BUILD_VERSION)) 81 INTERNAL_CLEAN_STEPS := $(strip $(INTERNAL_CLEAN_STEPS)) 82 83 # If the clean_steps.mk file is missing (usually after a clean build) 84 # then we won't do anything. 85 CURRENT_CLEAN_BUILD_VERSION := MISSING 86 CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS) 87 88 # Read the current state from the file, if present. 89 # Will set CURRENT_CLEAN_BUILD_VERSION and CURRENT_CLEAN_STEPS. 90 # 91 clean_steps_file := $(PRODUCT_OUT)/clean_steps.mk 92 -include $(clean_steps_file) 93 94 ifeq ($(CURRENT_CLEAN_BUILD_VERSION),MISSING) 95 # Do nothing 96 else ifneq ($(CURRENT_CLEAN_BUILD_VERSION),$(INTERNAL_CLEAN_BUILD_VERSION)) 97 # The major clean version is out-of-date. Do a full clean, and 98 # don't even bother with the clean steps. 99 $(info *** A clean build is required because of a recent change.) 100 $(shell rm -rf $(OUT_DIR)) 101 $(info *** Done with the cleaning, now starting the real build.) 102 else 103 # The major clean version is correct. Find the list of clean steps 104 # that we need to execute to get up-to-date. 105 steps := \ 106 $(filter-out $(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_STEPS)) 107 $(foreach step,$(steps), \ 108 $(info Clean step: $(INTERNAL_CLEAN_STEP.$(step))) \ 109 $(shell $(INTERNAL_CLEAN_STEP.$(step))) \ 110 ) 111 112 # Rewrite the clean step for the second arch. 113 ifdef TARGET_2ND_ARCH 114 # $(1): the clean step cmd 115 # $(2): the prefix to search for 116 # $(3): the prefix to replace with 117 define -cs-rewrite-cleanstep 118 $(if $(filter $(2)/%,$(1)),\ 119 $(eval _crs_new_cmd := $(patsubst $(2)/%,$(3)/%,$(1)))\ 120 $(info Clean step: $(_crs_new_cmd))\ 121 $(shell $(_crs_new_cmd))) 122 endef 123 $(foreach step,$(steps), \ 124 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_INTERMEDIATES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES))\ 125 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES))\ 126 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES))\ 127 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_INTERMEDIATES),$(TARGET_OUT_INTERMEDIATES))\ 128 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_SHARED_LIBRARIES),$(TARGET_OUT_SHARED_LIBRARIES))\ 129 $(call -cs-rewrite-cleanstep,$(INTERNAL_CLEAN_STEP.$(step)),$($(TARGET_2ND_ARCH_VAR_PREFIX)TARGET_OUT_VENDOR_SHARED_LIBRARIES),$(TARGET_OUT_VENDOR_SHARED_LIBRARIES))\ 130 ) 131 endif 132 _crs_new_cmd := 133 steps := 134 endif 135 136 # Write the new state to the file. 137 # 138 ifneq ($(CURRENT_CLEAN_BUILD_VERSION)-$(CURRENT_CLEAN_STEPS),$(INTERNAL_CLEAN_BUILD_VERSION)-$(INTERNAL_CLEAN_STEPS)) 139 $(shell mkdir -p $(dir $(clean_steps_file))) 140 $(file >$(clean_steps_file).tmp,CURRENT_CLEAN_BUILD_VERSION := $(INTERNAL_CLEAN_BUILD_VERSION)$(newline)CURRENT_CLEAN_STEPS := $(INTERNAL_CLEAN_STEPS)$(newline)) 141 $(shell if ! cmp -s $(clean_steps_file).tmp $(clean_steps_file); then \ 142 mv $(clean_steps_file).tmp $(clean_steps_file); \ 143 else \ 144 rm $(clean_steps_file).tmp; \ 145 fi) 146 endif 147 148 CURRENT_CLEAN_BUILD_VERSION := 149 CURRENT_CLEAN_STEPS := 150 clean_steps_file := 151 INTERNAL_CLEAN_STEPS := 152 INTERNAL_CLEAN_BUILD_VERSION := 153