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 17include art/build/Android.common_build.mk 18 19ART_HOST_EXECUTABLES ?= 20ART_TARGET_EXECUTABLES ?= 21 22ART_EXECUTABLES_CFLAGS := 23 24# $(1): executable ("d" will be appended for debug version) 25# $(2): source 26# $(3): extra shared libraries 27# $(4): extra include directories 28# $(5): target or host 29# $(6): ndebug or debug 30# $(7): value for LOCAL_MULTILIB (empty means default) 31# $(8): static or shared (empty means shared, applies only for host) 32define build-art-executable 33 ifneq ($(5),target) 34 ifneq ($(5),host) 35 $$(error expected target or host for argument 5, received $(5)) 36 endif 37 endif 38 ifneq ($(6),ndebug) 39 ifneq ($(6),debug) 40 $$(error expected ndebug or debug for argument 6, received $(6)) 41 endif 42 endif 43 44 art_executable := $(1) 45 art_source := $(2) 46 art_libraries := $(3) 47 art_c_includes := $(4) 48 art_target_or_host := $(5) 49 art_ndebug_or_debug := $(6) 50 art_multilib := $(7) 51 art_static_or_shared := $(8) 52 art_out_binary_name := 53 54 include $(CLEAR_VARS) 55 LOCAL_CPP_EXTENSION := $(ART_CPP_EXTENSION) 56 LOCAL_MODULE_TAGS := optional 57 LOCAL_SRC_FILES := $$(art_source) 58 LOCAL_C_INCLUDES += $(ART_C_INCLUDES) art/runtime art/cmdline $$(art_c_includes) 59 60 ifeq ($$(art_static_or_shared),static) 61 LOCAL_STATIC_LIBRARIES += $$(art_libraries) 62 else 63 LOCAL_SHARED_LIBRARIES += $$(art_libraries) 64 endif 65 66 ifeq ($$(art_ndebug_or_debug),ndebug) 67 LOCAL_MODULE := $$(art_executable) 68 else #debug 69 LOCAL_MODULE := $$(art_executable)d 70 endif 71 72 ifeq ($$(art_static_or_shared),static) 73 LOCAL_MODULE := $(LOCAL_MODULE)s 74 endif 75 76 LOCAL_CFLAGS := $(ART_EXECUTABLES_CFLAGS) 77 # Mac OS linker doesn't understand --export-dynamic. 78 ifneq ($$(HOST_OS)-$$(art_target_or_host),darwin-host) 79 LOCAL_LDFLAGS := -Wl,--export-dynamic 80 endif 81 82 ifeq ($$(art_target_or_host),target) 83 $(call set-target-local-clang-vars) 84 $(call set-target-local-cflags-vars,$(6)) 85 LOCAL_SHARED_LIBRARIES += libdl 86 else # host 87 LOCAL_CLANG := $(ART_HOST_CLANG) 88 LOCAL_LDLIBS := $(ART_HOST_LDLIBS) 89 LOCAL_CFLAGS += $(ART_HOST_CFLAGS) 90 LOCAL_ASFLAGS += $(ART_HOST_ASFLAGS) 91 ifeq ($$(art_ndebug_or_debug),debug) 92 LOCAL_CFLAGS += $(ART_HOST_DEBUG_CFLAGS) 93 else 94 LOCAL_CFLAGS += $(ART_HOST_NON_DEBUG_CFLAGS) 95 endif 96 LOCAL_LDLIBS += -lpthread -ldl 97 ifeq ($$(art_static_or_shared),static) 98 LOCAL_LDFLAGS += -static 99 # We need this because GC stress mode makes use of _Unwind_GetIP and _Unwind_Backtrace and 100 # the symbols are also defined in libgcc_eh.a(unwind-dw2.o) 101 # TODO: Having this is not ideal as it might obscure errors. Try to get rid of it. 102 LOCAL_LDFLAGS += -z muldefs 103 ifeq ($$(HOST_OS),linux) 104 LOCAL_LDLIBS += -lrt -lncurses -ltinfo 105 endif 106 ifeq ($$(HOST_OS),darwin) 107 LOCAL_LDLIBS += -lncurses -ltinfo 108 endif 109 endif 110 111 endif 112 113 # If dynamically linked add libart by default. Statically linked executables 114 # needs to specify it in art_libraries to ensure proper ordering. 115 ifeq ($$(art_ndebug_or_debug),ndebug) 116 ifneq ($$(art_static_or_shared),static) 117 LOCAL_SHARED_LIBRARIES += libart 118 endif 119 else # debug 120 ifneq ($$(art_static_or_shared),static) 121 LOCAL_SHARED_LIBRARIES += libartd 122 endif 123 endif 124 125 LOCAL_ADDITIONAL_DEPENDENCIES := art/build/Android.common_build.mk 126 LOCAL_ADDITIONAL_DEPENDENCIES += art/build/Android.common_utils.mk 127 LOCAL_ADDITIONAL_DEPENDENCIES += art/build/Android.executable.mk 128 129 ifeq ($$(art_target_or_host),target) 130 LOCAL_MODULE_TARGET_ARCH := $(ART_SUPPORTED_ARCH) 131 endif 132 133 ifdef ART_MULTILIB_OVERRIDE_$$(art_target_or_host) 134 art_multilib := $$(ART_MULTILIB_OVERRIDE_$$(art_target_or_host)) 135 endif 136 137 LOCAL_MULTILIB := $$(art_multilib) 138 art_out_binary_name := $$(LOCAL_MODULE) 139 140 # If multilib=both (potentially building both 32-bit and 64-bit), need to provide stem. 141 ifeq ($$(art_multilib),both) 142 # Set up a 32-bit/64-bit stem if we are building both binaries. 143 # In this case, the 32-bit binary has an additional 32-bit suffix. 144 LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE)32 145 LOCAL_MODULE_STEM_64 := $$(LOCAL_MODULE) 146 147 # Remember the binary names so we can add them to the global art executables list later. 148 art_out_binary_name := $$(LOCAL_MODULE_STEM_32) $$(LOCAL_MODULE_STEM_64) 149 150 # For single-architecture targets, remove any binary name suffixes. 151 ifeq ($$(art_target_or_host),target) 152 ifeq (,$(TARGET_2ND_ARCH)) 153 LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE) 154 art_out_binary_name := $$(LOCAL_MODULE) 155 endif 156 endif 157 158 # For single-architecture hosts, remove any binary name suffixes. 159 ifeq ($$(art_target_or_host),host) 160 ifeq (,$(HOST_2ND_ARCH)) 161 LOCAL_MODULE_STEM_32 := $$(LOCAL_MODULE) 162 art_out_binary_name := $$(LOCAL_MODULE) 163 endif 164 endif 165 endif 166 167 LOCAL_NATIVE_COVERAGE := $(ART_COVERAGE) 168 169 ifeq ($$(art_target_or_host),target) 170 include $(BUILD_EXECUTABLE) 171 ART_TARGET_EXECUTABLES := $(ART_TARGET_EXECUTABLES) $$(foreach name,$$(art_out_binary_name),$(TARGET_OUT_EXECUTABLES)/$$(name)) 172 else # host 173 LOCAL_IS_HOST_MODULE := true 174 include $(BUILD_HOST_EXECUTABLE) 175 ART_HOST_EXECUTABLES := $(ART_HOST_EXECUTABLES) $$(foreach name,$$(art_out_binary_name),$(HOST_OUT_EXECUTABLES)/$$(name)) 176 endif 177 178 # Clear out local variables now that we're done with them. 179 art_executable := 180 art_source := 181 art_libraries := 182 art_c_includes := 183 art_target_or_host := 184 art_ndebug_or_debug := 185 art_multilib := 186 art_static_or_shared := 187 art_out_binary_name := 188 189endef 190 191# 192# Build many art executables from multiple variations (debug/ndebug, host/target, 32/64bit). 193# By default only either 32-bit or 64-bit is built (but not both -- see multilib arg). 194# All other variations are gated by ANDROID_BUILD_(TARGET|HOST)_[N]DEBUG. 195# The result must be eval-uated. 196# 197# $(1): executable name 198# $(2): source files 199# $(3): library dependencies (common); debug prefix is added on as necessary automatically. 200# $(4): library dependencies (target only) 201# $(5): library dependencies (host only) 202# $(6): extra include directories 203# $(7): multilib (default: empty), valid values: {,32,64,both}) 204# $(8): host prefer 32-bit: {true, false} (default: false). If argument 205# `multilib` is explicitly set to 64, ignore the "host prefer 32-bit" 206# setting and only build a 64-bit executable on host. 207define build-art-multi-executable 208 $(foreach debug_flavor,ndebug debug, 209 $(foreach target_flavor,host target, 210 art-multi-binary-name := $(1) 211 art-multi-source-files := $(2) 212 art-multi-lib-dependencies := $(3) 213 art-multi-lib-dependencies-target := $(4) 214 art-multi-lib-dependencies-host := $(5) 215 art-multi-include-extra := $(6) 216 art-multi-multilib := $(7) 217 art-multi-host-prefer-32-bit := $(8) 218 219 # Add either -host or -target specific lib dependencies to the lib dependencies. 220 art-multi-lib-dependencies += $$(art-multi-lib-dependencies-$(target_flavor)) 221 222 # Replace libart- prefix with libartd- for debug flavor. 223 ifeq ($(debug_flavor),debug) 224 art-multi-lib-dependencies := $$(subst libart-,libartd-,$$(art-multi-lib-dependencies)) 225 endif 226 227 # Build the env guard var name, e.g. ART_BUILD_HOST_NDEBUG. 228 art-multi-env-guard := $$(call art-string-to-uppercase,ART_BUILD_$(target_flavor)_$(debug_flavor)) 229 230 ifeq ($(target_flavor),host) 231 ifeq ($$(art-multi-host-prefer-32-bit),true) 232 ifneq ($$(art-multi-multilib),64) 233 art-multi-multilib := 32 234 endif 235 endif 236 endif 237 238 # Build the art executable only if the corresponding env guard was set. 239 ifeq ($$($$(art-multi-env-guard)),true) 240 $$(eval $$(call build-art-executable,$$(art-multi-binary-name),$$(art-multi-source-files),$$(art-multi-lib-dependencies),$$(art-multi-include-extra),$(target_flavor),$(debug_flavor),$$(art-multi-multilib))) 241 endif 242 243 # Clear locals now they've served their purpose. 244 art-multi-binary-name := 245 art-multi-source-files := 246 art-multi-lib-dependencies := 247 art-multi-lib-dependencies-target := 248 art-multi-lib-dependencies-host := 249 art-multi-include-extra := 250 art-multi-multilib := 251 art-multi-host-prefer-32-bit := 252 art-multi-env-guard := 253 ) 254 ) 255endef 256