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