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