1#
2# Copyright (C) 2011 The Android Open Source Project
3#
4# Licensed under the Apache License, Version 2.0 (the "License");
5# you may not use this file except in compliance with the License.
6# You may obtain a copy of the License at
7#
8#      http://www.apache.org/licenses/LICENSE-2.0
9#
10# Unless required by applicable law or agreed to in writing, software
11# distributed under the License is distributed on an "AS IS" BASIS,
12# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13# See the License for the specific language governing permissions and
14# limitations under the License.
15#
16
17ifndef ART_ANDROID_COMMON_BUILD_MK
18ART_ANDROID_COMMON_BUILD_MK = true
19
20include art/build/Android.common.mk
21include art/build/Android.common_utils.mk
22
23# These can be overridden via the environment or by editing to
24# enable/disable certain build configuration.
25#
26# For example, to disable everything but the host debug build you use:
27#
28# (export ART_BUILD_TARGET_NDEBUG=false && export ART_BUILD_TARGET_DEBUG=false && export ART_BUILD_HOST_NDEBUG=false && ...)
29#
30# Beware that tests may use the non-debug build for performance, notable 055-enum-performance
31#
32ART_BUILD_TARGET_NDEBUG ?= true
33ART_BUILD_TARGET_DEBUG ?= true
34ART_BUILD_HOST_NDEBUG ?= true
35ART_BUILD_HOST_DEBUG ?= true
36
37# Set this to change what opt level Art is built at.
38ART_DEBUG_OPT_FLAG ?= -O2
39ART_NDEBUG_OPT_FLAG ?= -O3
40
41# Enable the static builds only for checkbuilds.
42ifneq (,$(filter checkbuild,$(MAKECMDGOALS)))
43  ART_BUILD_HOST_STATIC ?= true
44else
45  ART_BUILD_HOST_STATIC ?= false
46endif
47
48# Asan does not support static linkage
49ifdef SANITIZE_HOST
50  ART_BUILD_HOST_STATIC := false
51endif
52
53ifneq ($(HOST_OS),linux)
54  ART_BUILD_HOST_STATIC := false
55endif
56
57ifeq ($(ART_BUILD_TARGET_NDEBUG),false)
58$(info Disabling ART_BUILD_TARGET_NDEBUG)
59endif
60ifeq ($(ART_BUILD_TARGET_DEBUG),false)
61$(info Disabling ART_BUILD_TARGET_DEBUG)
62endif
63ifeq ($(ART_BUILD_HOST_NDEBUG),false)
64$(info Disabling ART_BUILD_HOST_NDEBUG)
65endif
66ifeq ($(ART_BUILD_HOST_DEBUG),false)
67$(info Disabling ART_BUILD_HOST_DEBUG)
68endif
69ifeq ($(ART_BUILD_HOST_STATIC),true)
70$(info Enabling ART_BUILD_HOST_STATIC)
71endif
72
73ifeq ($(ART_TEST_DEBUG_GC),true)
74  ART_DEFAULT_GC_TYPE := SS
75  ART_USE_TLAB := true
76endif
77
78#
79# Used to enable JIT
80#
81ART_JIT := false
82ifneq ($(wildcard art/JIT_ART),)
83$(info Enabling ART_JIT because of existence of art/JIT_ART)
84ART_JIT := true
85endif
86ifeq ($(WITH_ART_JIT), true)
87ART_JIT := true
88endif
89
90#
91# Used to change the default GC. Valid values are CMS, SS, GSS. The default is CMS.
92#
93ART_DEFAULT_GC_TYPE ?= CMS
94art_default_gc_type_cflags := -DART_DEFAULT_GC_TYPE_IS_$(ART_DEFAULT_GC_TYPE)
95
96ART_HOST_CFLAGS :=
97ART_TARGET_CFLAGS :=
98
99ART_HOST_ASFLAGS :=
100ART_TARGET_ASFLAGS :=
101
102# Clang build support.
103
104# Host.
105ART_HOST_CLANG := false
106ifneq ($(WITHOUT_HOST_CLANG),true)
107  # By default, host builds use clang for better warnings.
108  ART_HOST_CLANG := true
109endif
110
111# Clang on the target. Target builds use GCC by default.
112ifneq ($(USE_CLANG_PLATFORM_BUILD),)
113ART_TARGET_CLANG := $(USE_CLANG_PLATFORM_BUILD)
114else
115ART_TARGET_CLANG := false
116endif
117ART_TARGET_CLANG_arm :=
118ART_TARGET_CLANG_arm64 :=
119ART_TARGET_CLANG_mips :=
120ART_TARGET_CLANG_mips64 :=
121ART_TARGET_CLANG_x86 :=
122ART_TARGET_CLANG_x86_64 :=
123
124define set-target-local-clang-vars
125    LOCAL_CLANG := $(ART_TARGET_CLANG)
126    $(foreach arch,$(ART_TARGET_SUPPORTED_ARCH),
127      ifneq ($$(ART_TARGET_CLANG_$(arch)),)
128        LOCAL_CLANG_$(arch) := $$(ART_TARGET_CLANG_$(arch))
129      endif)
130endef
131
132ART_TARGET_CLANG_CFLAGS :=
133ART_TARGET_CLANG_CFLAGS_arm :=
134ART_TARGET_CLANG_CFLAGS_arm64 :=
135ART_TARGET_CLANG_CFLAGS_mips :=
136ART_TARGET_CLANG_CFLAGS_mips64 :=
137ART_TARGET_CLANG_CFLAGS_x86 :=
138ART_TARGET_CLANG_CFLAGS_x86_64 :=
139
140# Warn about thread safety violations with clang.
141art_clang_cflags := -Wthread-safety -Wthread-safety-negative
142
143# Warn if switch fallthroughs aren't annotated.
144art_clang_cflags += -Wimplicit-fallthrough
145
146# Enable float equality warnings.
147art_clang_cflags += -Wfloat-equal
148
149# Enable warning of converting ints to void*.
150art_clang_cflags += -Wint-to-void-pointer-cast
151
152# Enable warning of wrong unused annotations.
153art_clang_cflags += -Wused-but-marked-unused
154
155# Enable warning for deprecated language features.
156art_clang_cflags += -Wdeprecated
157
158# Enable warning for unreachable break & return.
159art_clang_cflags += -Wunreachable-code-break -Wunreachable-code-return
160
161# Enable missing-noreturn only on non-Mac. As lots of things are not implemented for Apple, it's
162# a pain.
163ifneq ($(HOST_OS),darwin)
164  art_clang_cflags += -Wmissing-noreturn
165endif
166
167
168# GCC-only warnings.
169art_gcc_cflags := -Wunused-but-set-parameter
170# Suggest const: too many false positives, but good for a trial run.
171#                  -Wsuggest-attribute=const
172# Useless casts: too many, as we need to be 32/64 agnostic, but the compiler knows.
173#                  -Wuseless-cast
174# Zero-as-null: Have to convert all NULL and "diagnostic ignore" all includes like libnativehelper
175# that are still stuck pre-C++11.
176#                  -Wzero-as-null-pointer-constant \
177# Suggest final: Have to move to a more recent GCC.
178#                  -Wsuggest-final-types
179
180ART_TARGET_CLANG_CFLAGS := $(art_clang_cflags)
181ifeq ($(ART_HOST_CLANG),true)
182  # Bug: 15446488. We don't omit the frame pointer to work around
183  # clang/libunwind bugs that cause SEGVs in run-test-004-ThreadStress.
184  ART_HOST_CFLAGS += $(art_clang_cflags) -fno-omit-frame-pointer
185else
186  ART_HOST_CFLAGS += $(art_gcc_cflags)
187endif
188ifneq ($(ART_TARGET_CLANG),true)
189  ART_TARGET_CFLAGS += $(art_gcc_cflags)
190else
191  # TODO: if we ever want to support GCC/Clang mix for multi-target products, this needs to be
192  #       split up.
193  ifeq ($(ART_TARGET_CLANG_$(TARGET_ARCH)),false)
194    ART_TARGET_CFLAGS += $(art_gcc_cflags)
195  endif
196endif
197
198# Clear local variables now their use has ended.
199art_clang_cflags :=
200art_gcc_cflags :=
201
202ART_CPP_EXTENSION := .cc
203
204ART_C_INCLUDES := \
205  external/gtest/include \
206  external/icu/icu4c/source/common \
207  external/lz4/lib \
208  external/valgrind/include \
209  external/valgrind \
210  external/vixl/src \
211  external/zlib \
212
213# We optimize Thread::Current() with a direct TLS access. This requires access to a private
214# Bionic header.
215# Note: technically we only need this on device, but this avoids the duplication of the includes.
216ART_C_INCLUDES += bionic/libc/private
217
218# Base set of cflags used by all things ART.
219art_cflags := \
220  -fno-rtti \
221  -std=gnu++11 \
222  -ggdb3 \
223  -Wall \
224  -Werror \
225  -Wextra \
226  -Wstrict-aliasing \
227  -fstrict-aliasing \
228  -Wunreachable-code \
229  -Wredundant-decls \
230  -Wshadow \
231  -Wunused \
232  -fvisibility=protected \
233  $(art_default_gc_type_cflags)
234
235# The architectures the compiled tools are able to run on. Setting this to 'all' will cause all
236# architectures to be included.
237ART_TARGET_CODEGEN_ARCHS ?= all
238ART_HOST_CODEGEN_ARCHS ?= all
239
240ifeq ($(ART_TARGET_CODEGEN_ARCHS),all)
241  ART_TARGET_CODEGEN_ARCHS := $(sort $(ART_TARGET_SUPPORTED_ARCH) $(ART_HOST_SUPPORTED_ARCH))
242  # We need to handle the fact that some compiler tests mix code from different architectures.
243  ART_TARGET_COMPILER_TESTS ?= true
244else
245  ART_TARGET_COMPILER_TESTS := false
246  ifeq ($(ART_TARGET_CODEGEN_ARCHS),svelte)
247    ART_TARGET_CODEGEN_ARCHS := $(sort $(ART_TARGET_ARCH_64) $(ART_TARGET_ARCH_32))
248  endif
249endif
250ifeq ($(ART_HOST_CODEGEN_ARCHS),all)
251  ART_HOST_CODEGEN_ARCHS := $(sort $(ART_TARGET_SUPPORTED_ARCH) $(ART_HOST_SUPPORTED_ARCH))
252  ART_HOST_COMPILER_TESTS ?= true
253else
254  ART_HOST_COMPILER_TESTS := false
255  ifeq ($(ART_HOST_CODEGEN_ARCHS),svelte)
256    ART_HOST_CODEGEN_ARCHS := $(sort $(ART_TARGET_CODEGEN_ARCHS) $(ART_HOST_ARCH_64) $(ART_HOST_ARCH_32))
257  endif
258endif
259
260ifneq (,$(filter arm64,$(ART_TARGET_CODEGEN_ARCHS)))
261  ART_TARGET_CODEGEN_ARCHS += arm
262endif
263ifneq (,$(filter mips64,$(ART_TARGET_CODEGEN_ARCHS)))
264  ART_TARGET_CODEGEN_ARCHS += mips
265endif
266ifneq (,$(filter x86_64,$(ART_TARGET_CODEGEN_ARCHS)))
267  ART_TARGET_CODEGEN_ARCHS += x86
268endif
269ART_TARGET_CODEGEN_ARCHS := $(sort $(ART_TARGET_CODEGEN_ARCHS))
270ifneq (,$(filter arm64,$(ART_HOST_CODEGEN_ARCHS)))
271  ART_HOST_CODEGEN_ARCHS += arm
272endif
273ifneq (,$(filter mips64,$(ART_HOST_CODEGEN_ARCHS)))
274  ART_HOST_CODEGEN_ARCHS += mips
275endif
276ifneq (,$(filter x86_64,$(ART_HOST_CODEGEN_ARCHS)))
277  ART_HOST_CODEGEN_ARCHS += x86
278endif
279ART_HOST_CODEGEN_ARCHS := $(sort $(ART_HOST_CODEGEN_ARCHS))
280
281# Base set of cflags used by target build only
282art_target_cflags := \
283  $(foreach target_arch,$(strip $(ART_TARGET_CODEGEN_ARCHS)), -DART_ENABLE_CODEGEN_$(target_arch))
284# Base set of cflags used by host build only
285art_host_cflags := \
286  $(foreach host_arch,$(strip $(ART_HOST_CODEGEN_ARCHS)), -DART_ENABLE_CODEGEN_$(host_arch))
287
288# Base set of asflags used by all things ART.
289art_asflags :=
290
291# Missing declarations: too many at the moment, as we use "extern" quite a bit.
292#  -Wmissing-declarations \
293
294
295
296ifdef ART_IMT_SIZE
297  art_cflags += -DIMT_SIZE=$(ART_IMT_SIZE)
298else
299  # Default is 64
300  art_cflags += -DIMT_SIZE=64
301endif
302
303ifeq ($(ART_HEAP_POISONING),true)
304  art_cflags += -DART_HEAP_POISONING=1
305  art_asflags += -DART_HEAP_POISONING=1
306endif
307
308#
309# Used to change the read barrier type. Valid values are BAKER, BROOKS, TABLELOOKUP.
310# The default is BAKER.
311#
312ART_READ_BARRIER_TYPE ?= BAKER
313
314ifeq ($(ART_USE_READ_BARRIER),true)
315  art_cflags += -DART_USE_READ_BARRIER=1
316  art_cflags += -DART_READ_BARRIER_TYPE_IS_$(ART_READ_BARRIER_TYPE)=1
317  art_asflags += -DART_USE_READ_BARRIER=1
318  art_asflags += -DART_READ_BARRIER_TYPE_IS_$(ART_READ_BARRIER_TYPE)=1
319
320  # Temporarily override -fstack-protector-strong with -fstack-protector to avoid a major
321  # slowdown with the read barrier config. b/26744236.
322  art_cflags += -fstack-protector
323endif
324
325ifeq ($(ART_USE_TLAB),true)
326  art_cflags += -DART_USE_TLAB=1
327endif
328
329# Cflags for non-debug ART and ART tools.
330art_non_debug_cflags := \
331  $(ART_NDEBUG_OPT_FLAG)
332
333# Cflags for debug ART and ART tools.
334art_debug_cflags := \
335  $(ART_DEBUG_OPT_FLAG) \
336  -DDYNAMIC_ANNOTATIONS_ENABLED=1 \
337  -UNDEBUG
338
339art_host_non_debug_cflags := $(art_non_debug_cflags)
340art_target_non_debug_cflags := $(art_non_debug_cflags)
341
342ifeq ($(HOST_OS),linux)
343  # Larger frame-size for host clang builds today
344  ifneq ($(ART_COVERAGE),true)
345    ifneq ($(NATIVE_COVERAGE),true)
346      art_host_non_debug_cflags += -Wframe-larger-than=2700
347      ifdef SANITIZE_TARGET
348        art_target_non_debug_cflags += -Wframe-larger-than=6400
349      else
350        art_target_non_debug_cflags += -Wframe-larger-than=1728
351      endif
352    endif
353  endif
354endif
355
356ifndef LIBART_IMG_HOST_BASE_ADDRESS
357  $(error LIBART_IMG_HOST_BASE_ADDRESS unset)
358endif
359ART_HOST_CFLAGS += $(art_cflags) -DART_BASE_ADDRESS=$(LIBART_IMG_HOST_BASE_ADDRESS)
360ART_HOST_CFLAGS += -DART_DEFAULT_INSTRUCTION_SET_FEATURES=default $(art_host_cflags)
361ART_HOST_ASFLAGS += $(art_asflags)
362
363ifndef LIBART_IMG_TARGET_BASE_ADDRESS
364  $(error LIBART_IMG_TARGET_BASE_ADDRESS unset)
365endif
366ART_TARGET_CFLAGS += $(art_cflags) -DART_TARGET -DART_BASE_ADDRESS=$(LIBART_IMG_TARGET_BASE_ADDRESS)
367ART_TARGET_CFLAGS += $(art_target_cflags)
368ART_TARGET_ASFLAGS += $(art_asflags)
369
370ART_HOST_NON_DEBUG_CFLAGS := $(art_host_non_debug_cflags)
371ART_TARGET_NON_DEBUG_CFLAGS := $(art_target_non_debug_cflags)
372ART_HOST_DEBUG_CFLAGS := $(art_debug_cflags)
373ART_TARGET_DEBUG_CFLAGS := $(art_debug_cflags)
374
375ifndef LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA
376  LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA=-0x1000000
377endif
378ifndef LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA
379  LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA=0x1000000
380endif
381ART_HOST_CFLAGS += -DART_BASE_ADDRESS_MIN_DELTA=$(LIBART_IMG_HOST_MIN_BASE_ADDRESS_DELTA)
382ART_HOST_CFLAGS += -DART_BASE_ADDRESS_MAX_DELTA=$(LIBART_IMG_HOST_MAX_BASE_ADDRESS_DELTA)
383
384ifndef LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA
385  LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA=-0x1000000
386endif
387ifndef LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA
388  LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA=0x1000000
389endif
390ART_TARGET_CFLAGS += -DART_BASE_ADDRESS_MIN_DELTA=$(LIBART_IMG_TARGET_MIN_BASE_ADDRESS_DELTA)
391ART_TARGET_CFLAGS += -DART_BASE_ADDRESS_MAX_DELTA=$(LIBART_IMG_TARGET_MAX_BASE_ADDRESS_DELTA)
392
393# To use oprofile_android --callgraph, uncomment this and recompile with "mmm art -B -j16"
394# ART_TARGET_CFLAGS += -fno-omit-frame-pointer -marm -mapcs
395
396# Clear locals now they've served their purpose.
397art_cflags :=
398art_asflags :=
399art_host_cflags :=
400art_target_cflags :=
401art_debug_cflags :=
402art_non_debug_cflags :=
403art_host_non_debug_cflags :=
404art_target_non_debug_cflags :=
405art_default_gc_type_cflags :=
406
407ART_HOST_LDLIBS :=
408ifneq ($(ART_HOST_CLANG),true)
409  # GCC lacks libc++ assumed atomic operations, grab via libatomic.
410  ART_HOST_LDLIBS += -latomic
411endif
412
413ART_TARGET_LDFLAGS :=
414
415# $(1): ndebug_or_debug
416define set-target-local-cflags-vars
417  LOCAL_CFLAGS += $(ART_TARGET_CFLAGS)
418  LOCAL_CFLAGS_x86 += $(ART_TARGET_CFLAGS_x86)
419  LOCAL_ASFLAGS += $(ART_TARGET_ASFLAGS)
420  LOCAL_LDFLAGS += $(ART_TARGET_LDFLAGS)
421  art_target_cflags_ndebug_or_debug := $(1)
422  ifeq ($$(art_target_cflags_ndebug_or_debug),debug)
423    LOCAL_CFLAGS += $(ART_TARGET_DEBUG_CFLAGS)
424  else
425    LOCAL_CFLAGS += $(ART_TARGET_NON_DEBUG_CFLAGS)
426  endif
427
428  LOCAL_CLANG_CFLAGS := $(ART_TARGET_CLANG_CFLAGS)
429  $(foreach arch,$(ART_TARGET_SUPPORTED_ARCH),
430    LOCAL_CLANG_CFLAGS_$(arch) += $$(ART_TARGET_CLANG_CFLAGS_$(arch)))
431
432  # Clear locally used variables.
433  art_target_cflags_ndebug_or_debug :=
434endef
435
436# Support for disabling certain builds.
437ART_BUILD_TARGET := false
438ART_BUILD_HOST := false
439ART_BUILD_NDEBUG := false
440ART_BUILD_DEBUG := false
441ifeq ($(ART_BUILD_TARGET_NDEBUG),true)
442  ART_BUILD_TARGET := true
443  ART_BUILD_NDEBUG := true
444endif
445ifeq ($(ART_BUILD_TARGET_DEBUG),true)
446  ART_BUILD_TARGET := true
447  ART_BUILD_DEBUG := true
448endif
449ifeq ($(ART_BUILD_HOST_NDEBUG),true)
450  ART_BUILD_HOST := true
451  ART_BUILD_NDEBUG := true
452endif
453ifeq ($(ART_BUILD_HOST_DEBUG),true)
454  ART_BUILD_HOST := true
455  ART_BUILD_DEBUG := true
456endif
457
458endif # ART_ANDROID_COMMON_BUILD_MK
459