ninja.mk revision ffc9c52243499d5d65edfd7f795ae44370f64a29
1NINJA ?= prebuilts/ninja/$(HOST_PREBUILT_TAG)/ninja 2 3ifeq ($(USE_SOONG),true) 4USE_SOONG_FOR_KATI := true 5endif 6 7ifeq ($(USE_SOONG_FOR_KATI),true) 8include $(BUILD_SYSTEM)/soong.mk 9else 10KATI ?= $(HOST_OUT_EXECUTABLES)/ckati 11MAKEPARALLEL ?= $(HOST_OUT_EXECUTABLES)/makeparallel 12endif 13 14KATI_OUTPUT_PATTERNS := $(OUT_DIR)/build%.ninja $(OUT_DIR)/ninja%.sh 15 16# Modifier goals we don't need to pass to Ninja. 17NINJA_EXCLUDE_GOALS := showcommands all dist 18.PHONY : $(NINJA_EXCLUDE_GOALS) 19 20# A list of goals which affect parsing of makefiles and we need to pass to Kati. 21PARSE_TIME_MAKE_GOALS := \ 22 $(PARSE_TIME_MAKE_GOALS) \ 23 $(dont_bother_goals) \ 24 all \ 25 APP-% \ 26 DUMP_% \ 27 ECLIPSE-% \ 28 PRODUCT-% \ 29 boottarball-nodeps \ 30 btnod \ 31 build-art% \ 32 build_kernel-nodeps \ 33 clean-oat% \ 34 continuous_instrumentation_tests \ 35 continuous_native_tests \ 36 cts \ 37 custom_images \ 38 deps-license \ 39 dicttool_aosp \ 40 dist \ 41 dump-products \ 42 dumpvar-% \ 43 eng \ 44 fusion \ 45 oem_image \ 46 old-cts \ 47 online-system-api-sdk-docs \ 48 pdk \ 49 platform \ 50 platform-java \ 51 product-graph \ 52 samplecode \ 53 sdk \ 54 sdk_addon \ 55 sdk_repo \ 56 snod \ 57 stnod \ 58 systemimage-nodeps \ 59 systemtarball-nodeps \ 60 target-files-package \ 61 test-art% \ 62 user \ 63 userdataimage \ 64 userdebug \ 65 valgrind-test-art% \ 66 win_sdk \ 67 winsdk-tools 68 69-include vendor/google/build/ninja_config.mk 70 71# Any Android goals that need to be built. 72ANDROID_GOALS := $(filter-out $(KATI_OUTPUT_PATTERNS) $(KATI) $(MAKEPARALLEL),\ 73 $(sort $(ORIGINAL_MAKECMDGOALS) $(MAKECMDGOALS))) 74# Goals we need to pass to Ninja. 75NINJA_GOALS := $(filter-out $(NINJA_EXCLUDE_GOALS), $(ANDROID_GOALS)) 76# Goals we need to pass to Kati. 77KATI_GOALS := $(filter $(PARSE_TIME_MAKE_GOALS), $(ANDROID_GOALS)) 78 79define replace_space_and_slash 80$(subst /,_,$(subst $(space),_,$(sort $1))) 81endef 82 83KATI_NINJA_SUFFIX := -$(TARGET_PRODUCT) 84ifneq ($(KATI_GOALS),) 85KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-$(call replace_space_and_slash,$(KATI_GOALS)) 86endif 87ifneq ($(ONE_SHOT_MAKEFILE),) 88KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-mmm-$(call replace_space_and_slash,$(ONE_SHOT_MAKEFILE)) 89endif 90ifneq ($(BUILD_MODULES_IN_PATHS),) 91KATI_NINJA_SUFFIX := $(KATI_NINJA_SUFFIX)-mmma-$(call replace_space_and_slash,$(BUILD_MODULES_IN_PATHS)) 92endif 93 94my_checksum_suffix := 95my_ninja_suffix_too_long := $(filter 1, $(shell v='$(KATI_NINJA_SUFFIX)' && echo $$(($${$(pound)v} > 64)))) 96ifneq ($(my_ninja_suffix_too_long),) 97# Replace the suffix with a checksum if it gets too long. 98my_checksum_suffix := $(KATI_NINJA_SUFFIX) 99KATI_NINJA_SUFFIX := -$(word 1, $(shell echo $(my_checksum_suffix) | $(MD5SUM))) 100endif 101 102KATI_BUILD_NINJA := $(OUT_DIR)/build$(KATI_NINJA_SUFFIX).ninja 103KATI_ENV_SH := $(OUT_DIR)/env$(KATI_NINJA_SUFFIX).sh 104 105# Write out a file mapping checksum to the real suffix. 106ifneq ($(my_checksum_suffix),) 107my_ninja_suffix_file := $(basename $(KATI_BUILD_NINJA)).suf 108$(shell mkdir -p $(dir $(my_ninja_suffix_file)) && \ 109 echo $(my_checksum_suffix) > $(my_ninja_suffix_file)) 110endif 111 112ifeq (,$(NINJA_STATUS)) 113NINJA_STATUS := [%p %s/%t]$(space) 114endif 115 116ifneq (,$(filter showcommands,$(ORIGINAL_MAKECMDGOALS))) 117NINJA_ARGS += "-v" 118endif 119 120ifdef USE_GOMA 121KATI_MAKEPARALLEL := $(MAKEPARALLEL) 122# Ninja runs remote jobs (i.e., commands which contain gomacc) with 123# this parallelism. Note the parallelism of all other jobs is still 124# limited by the -j flag passed to GNU make. 125NINJA_REMOTE_NUM_JOBS ?= 500 126NINJA_ARGS += -j$(NINJA_REMOTE_NUM_JOBS) 127else 128NINJA_MAKEPARALLEL := $(MAKEPARALLEL) --ninja 129endif 130 131ifeq ($(USE_SOONG),true) 132COMBINED_BUILD_NINJA := $(OUT_DIR)/combined$(KATI_NINJA_SUFFIX).ninja 133 134$(COMBINED_BUILD_NINJA): $(KATI_BUILD_NINJA) $(SOONG_ANDROID_MK) 135 $(hide) echo "builddir = $(OUT_DIR)" > $(COMBINED_BUILD_NINJA) 136 $(hide) echo "subninja $(SOONG_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA) 137 $(hide) echo "subninja $(KATI_BUILD_NINJA)" >> $(COMBINED_BUILD_NINJA) 138else 139COMBINED_BUILD_NINJA := $(KATI_BUILD_NINJA) 140endif 141 142$(sort $(DEFAULT_GOAL) $(ANDROID_GOALS)) : ninja_wrapper 143 @#empty 144 145.PHONY: ninja_wrapper 146ninja_wrapper: $(COMBINED_BUILD_NINJA) $(MAKEPARALLEL) 147 @echo Starting build with ninja 148 +$(hide) export NINJA_STATUS="$(NINJA_STATUS)" && source $(KATI_ENV_SH) && $(NINJA_MAKEPARALLEL) $(NINJA) $(NINJA_GOALS) -C $(TOP) -f $(COMBINED_BUILD_NINJA) $(NINJA_ARGS) 149 150KATI_FIND_EMULATOR := --use_find_emulator 151ifeq ($(KATI_EMULATE_FIND),false) 152 KATI_FIND_EMULATOR := 153endif 154$(KATI_BUILD_NINJA): $(KATI) $(MAKEPARALLEL) $(SOONG_ANDROID_MK) FORCE 155 @echo Running kati to generate build$(KATI_NINJA_SUFFIX).ninja... 156 +$(hide) $(KATI_MAKEPARALLEL) $(KATI) --ninja --ninja_dir=$(OUT_DIR) --ninja_suffix=$(KATI_NINJA_SUFFIX) --regen --ignore_dirty=$(OUT_DIR)/% --no_ignore_dirty=$(SOONG_ANDROID_MK) --ignore_optional_include=$(OUT_DIR)/%.P --detect_android_echo $(KATI_FIND_EMULATOR) -f build/core/main.mk $(KATI_GOALS) --gen_all_targets BUILDING_WITH_NINJA=true SOONG_ANDROID_MK=$(SOONG_ANDROID_MK) 157 158ifneq ($(USE_SOONG_FOR_KATI),true) 159KATI_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) 160KATI_LD := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_LDFLAGS) 161# Build static ckati. Unfortunately Mac OS X doesn't officially support static exectuables. 162ifeq ($(BUILD_OS),linux) 163KATI_LD += -static 164endif 165 166KATI_INTERMEDIATES_PATH := $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/ckati_intermediates 167KATI_BIN_PATH := $(HOST_OUT_EXECUTABLES) 168include build/kati/Makefile.ckati 169 170MAKEPARALLEL_CXX := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_CFLAGS) $(CLANG_HOST_GLOBAL_CPPFLAGS) 171MAKEPARALLEL_LD := $(CLANG_CXX) $(CLANG_HOST_GLOBAL_LDFLAGS) 172# Build static makeparallel. Unfortunately Mac OS X doesn't officially support static exectuables. 173ifeq ($(BUILD_OS),linux) 174MAKEPARALLEL_LD += -static 175endif 176 177MAKEPARALLEL_INTERMEDIATES_PATH := $(HOST_OUT_INTERMEDIATES)/EXECUTABLES/makeparallel_intermediates 178MAKEPARALLEL_BIN_PATH := $(HOST_OUT_EXECUTABLES) 179include build/tools/makeparallel/Makefile 180endif 181 182.PHONY: FORCE 183FORCE: 184