OSDN Git Service

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