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