1 ifneq ($(filter true% %true,$(BUILD_EMULATOR)$(BUILD_STANDALONE_EMULATOR)),) 2 3 LOCAL_PATH:= $(call my-dir) 4 5 # determine the host tag to use 6 QEMU_HOST_TAG := $(HOST_PREBUILT_TAG) 7 ifneq ($(USE_MINGW),) 8 QEMU_HOST_TAG := windows 9 endif 10 11 # This defines EMULATOR_BUILD_64BITS to indicate that 64-bit binaries 12 # must be generated by the build system. For now, only do it for 13 # Linux and Darwin, since we the sources do not compile with Mingw-w64 14 # yet due to differing procedure call ABI conventions. 15 EMULATOR_BUILD_64BITS := $(strip $(filter linux darwin,$(HOST_OS))) 16 17 # Disable 64-bit build for Darwin platform builds. 18 ifeq ($(HOST_OS),darwin) 19 ifneq (true,$(BUILD_STANDALONE_EMULATOR)) 20 EMULATOR_BUILD_64BITS := $(strip $(empty)) 21 endif # BUILD_STANDALONE_EMULATOR != true 22 endif # HOST_OS == darwin 23 24 # A function that includes a file only if 32-bit binaries are necessary. 25 # This is always the case, but later used with include-if-bitness-64. 26 # $1: Build file to include. 27 include-if-bitness-32 = $(eval include $1) 28 29 # A function that includes a file only of EMULATOR_BUILD_64BITS is not empty. 30 # $1: Build file to include. 31 include-if-bitness-64 = $(if $(strip $(EMULATOR_BUILD_64BITS)),$(eval include $1)) 32 33 # determine the location of platform-specific directories 34 # 35 CONFIG_DIRS := \ 36 $(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG) 37 38 ifeq ($(BUILD_STANDALONE_EMULATOR),true) 39 CONFIG_DIRS := $(LOCAL_PATH)/objs $(CONFIG_DIRS) 40 endif 41 42 CONFIG_INCLUDES := $(CONFIG_DIRS:%=-I%) 43 44 MY_CC := $(HOST_CC) 45 MY_CXX := $(HOST_CXX) 46 MY_LD := $(HOST_LD) 47 MY_AR := $(HOST_AR) 48 49 MY_CFLAGS := $(CONFIG_INCLUDES) -g -falign-functions=0 50 ifeq ($(BUILD_DEBUG_EMULATOR),true) 51 MY_CFLAGS += -O0 52 else 53 MY_CFLAGS += -O2 54 endif 55 56 # Generate position-independent binaries. Don't add -fPIC when targetting 57 # Windows, because newer toolchain complain loudly about it, since all 58 # Windows code is position-independent. 59 ifneq (windows,$(HOST_OS)) 60 MY_CFLAGS += -fPIC 61 endif 62 63 MY_CFLAGS32 := 64 MY_CFLAGS64 := 65 66 MY_LDLIBS := 67 MY_LDLIBS32 := 68 MY_LDLIBS64 := 69 70 MY_LDFLAGS := 71 MY_LDFLAGS32 := 72 MY_LDFLAGS64 := 73 74 ifeq ($(HOST_OS),freebsd) 75 MY_CFLAGS += -I /usr/local/include 76 endif 77 78 ifeq ($(HOST_OS),windows) 79 # we need Win32 features that are available since Windows 2000 Professional/Server (NT 5.0) 80 MY_CFLAGS += -DWINVER=0x501 81 MY_CFLAGS += -D_WIN32 82 # LARGEADDRESSAWARE gives more address space to 32-bit process 83 MY_LDFLAGS32 += -Xlinker --large-address-aware 84 ifneq ($(HOST_IS_64_BIT),) 85 # Microsoft 64-bit compiler define both _WIN32 and _WIN64 86 MY_CFLAGS += -D_WIN64 87 # amd64-mingw32msvc- toolchain still name it vfw32. May change it once amd64-mingw32msvc- 88 # is stabilized 89 MY_LDLIBS += -lvfw32 90 else 91 MY_LDLIBS += -lvfw32 92 endif 93 endif 94 95 ifeq ($(HOST_ARCH),ppc) 96 MY_CFLAGS += -D__powerpc__ 97 endif 98 99 ifeq ($(HOST_OS),darwin) 100 MY_CFLAGS += -D_DARWIN_C_SOURCE=1 101 ifneq ($(host_toolchain_header),) 102 MY_CFLAGS += -isystem $(host_toolchain_header) 103 else 104 ifneq (,$(mac_sdk_root)) 105 MY_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) 106 MY_LDLIBS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) 107 108 # Clang complains about this flag being not useful anymore. 109 MY_CFLAGS := $(filter-out -falign-functions=0,$(MY_CFLAGS)) 110 endif 111 endif 112 endif 113 114 # NOTE: The following definitions are only used by the standalone build. 115 MY_EXEEXT := 116 MY_DLLEXT := .so 117 ifeq ($(HOST_OS),windows) 118 MY_EXEEXT := .exe 119 MY_DLLEXT := .dll 120 endif 121 ifeq ($(HOST_OS),darwin) 122 MY_DLLEXT := .dylib 123 endif 124 125 # Some CFLAGS below use -Wno-missing-field-initializers but this is not 126 # supported on GCC 3.x which is still present under Cygwin. 127 # Find out by probing GCC for support of this flag. Note that the test 128 # itself only works on GCC 4.x anyway. 129 GCC_W_NO_MISSING_FIELD_INITIALIZERS := -Wno-missing-field-initializers 130 ifeq ($(HOST_OS),windows) 131 ifeq (,$(shell gcc -Q --help=warnings 2>/dev/null | grep missing-field-initializers)) 132 $(info emulator: Ignoring unsupported GCC flag $(GCC_W_NO_MISSING_FIELD_INITIALIZERS)) 133 GCC_W_NO_MISSING_FIELD_INITIALIZERS := 134 endif 135 endif 136 137 # BUILD_STANDALONE_EMULATOR is only defined when building with 138 # the android-rebuild.sh script. The script will also provide 139 # adequate values for HOST_CC 140 # 141 ifneq ($(BUILD_STANDALONE_EMULATOR),true) 142 # On Linux, use our custom 32-bit host toolchain (unless HOST_IS_64_BIT=true) 143 # which contains the relevant headers and 32-bit libraries for audio (The host 64-bit 144 # Lucid doesn't provide these anymore, only their 64-bit versions). 145 ifeq ($(HOST_OS),linux) 146 HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/x86_64-linux- 147 ifeq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)gcc))) 148 # fallback to the previous host toolchain if new one isn't available 149 HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk/ 150 endif 151 # Don't do anything if the toolchain is not there 152 ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)gcc))) 153 MY_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)gcc 154 MY_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)g++ 155 MY_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)ar 156 endif # $(HOST_SDK_TOOLCHAIN_PREFIX)gcc exists 157 endif # HOST_OS == linux 158 159 ifneq ($(USE_CCACHE),) 160 ccache := prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache 161 ccache := $(strip $(wildcard $(ccache))) 162 ifneq ($(ccache),$(firstword $(MY_CC))) 163 MY_CC := $(ccache) $(MY_CC) 164 MY_CXX := $(ccache) $(MY_CXX) 165 endif 166 ccache := 167 endif 168 endif 169 170 171 ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true) 172 ifneq ($(HOST_IS_64_BIT),) 173 MY_CFLAGS += -m64 174 MY_LDFLAGS += -m64 175 else 176 ifneq ($(HOST_ARCH),x86_64) 177 MY_CFLAGS += -m32 178 MY_LDFLAGS += -m32 179 endif 180 endif 181 182 ifneq ($(BUILD_HOST_static),) 183 MY_LDLIBS += -static 184 endif 185 endif 186 187 ifeq ($(HOST_OS)-$(BUILD_STANDALONE_EMULATOR),windows-true) 188 # Ensure that printf() et al use GNU printf format specifiers as required 189 # by QEMU. This is important when using the newer Mingw64 cross-toolchain. 190 # See http://sourceforge.net/apps/trac/mingw-w64/wiki/gnu%20printf 191 MY_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1 192 endif 193 194 # Enable warning, except those related to missing field initializers 195 # (the QEMU coding style loves using these). 196 # 197 MY_CFLAGS += -Wall $(GCC_W_NO_MISSING_FIELD_INITIALIZERS) 198 199 # When using clang and ccache, disable the spammy warnings about unused 200 # parameters during compilation, and re-enable colored output. 201 # 202 # See http://petereisentraut.blogspot.fr/2011/05/ccache-and-clang.html 203 ifneq (,$(filter %ccache,$(MY_CC))) 204 ifneq (,$(filter LLVM,$(shell $(HOST_CC) -v 2>&1))) 205 MY_CFLAGS := -Qunused-arguments -fcolor-diagnostics $(MY_CFLAGS) 206 endif 207 endif 208 209 # Needed to build block.c on Linux/x86_64. 210 MY_CFLAGS += -D_GNU_SOURCE=1 211 212 MY_CFLAGS += -I$(LOCAL_PATH)/include 213 214 # Need to include "qapi-types.h" and other auto-generated files from 215 # android-configure.sh 216 MY_CFLAGS += -I$(LOCAL_PATH)/qapi-auto-generated 217 218 ifneq (true,$(BUILD_STANDALONE_EMULATOR)) 219 my-host-tool = $(MY_$1) 220 else 221 my-host-tool = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_$1),$(MY_$1)) 222 endif 223 224 # A useful function that can be used to start the declaration of a host 225 # module. Avoids repeating the same stuff again and again. 226 # Usage: 227 # 228 # $(call start-emulator-library, <module-name>) 229 # 230 # ... declarations 231 # 232 # $(call end-emulator-library) 233 # 234 start-emulator-library = \ 235 $(eval include $(CLEAR_VARS)) \ 236 $(eval LOCAL_NO_DEFAULT_COMPILER_FLAGS := true) \ 237 $(eval LOCAL_MODULE := $1) \ 238 $(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES) \ 239 $(eval LOCAL_MODULE_BITS := 32) 240 241 start-emulator64-library = \ 242 $(call start-emulator-library, $1) \ 243 $(eval LOCAL_MODULE_BITS := 64) 244 245 # Used with start-emulator-library 246 end-emulator-library = \ 247 $(eval $(end-emulator-module-ev)) \ 248 $(call include-if-bitness-$(LOCAL_MODULE_BITS), $(BUILD_HOST_STATIC_LIBRARY)) 249 250 # A variant of start-emulator-library to start the definition of a host 251 # program instead. Use with end-emulator-program 252 start-emulator-program = \ 253 $(call start-emulator-library,$1) \ 254 $(eval LOCAL_MODULE_CLASS := EXECUTABLES) 255 256 start-emulator64-program = \ 257 $(call start-emulator-program, $1) \ 258 $(eval LOCAL_MODULE_BITS := 64) 259 260 # A varient of end-emulator-library for host programs instead 261 end-emulator-program = \ 262 $(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \ 263 $(eval $(end-emulator-module-ev)) \ 264 $(call include-if-bitness-$(LOCAL_MODULE_BITS), $(BUILD_HOST_EXECUTABLE)) 265 266 define end-emulator-module-ev 267 LOCAL_CC := $$(call my-host-tool,CC) 268 LOCAL_CXX := $$(call my-host-tool,CXX) 269 LOCAL_AR := $$(call my-host-tool,AR) 270 LOCAL_LD := $$(call my-host-tool,LD) 271 272 LOCAL_CFLAGS := \ 273 $$(call my-host-tool,CFLAGS$$(LOCAL_MODULE_BITS)) \ 274 $$(call my-host-tool,CFLAGS) \ 275 $$(LOCAL_CFLAGS) 276 277 LOCAL_LDFLAGS := \ 278 $$(call my-host-tool,LDFLAGS$$(LOCAL_MODULE_BITS)) \ 279 $$(call my-host-tool,LDFLAGS) \ 280 $$(LOCAL_LDFLAGS) 281 282 LOCAL_LDLIBS := \ 283 $$(LOCAL_LDLIBS) \ 284 $$(call my-host-tool,LDLIBS) \ 285 $$(call my-host-tool,LDLIBS$$(LOCAL_MODULE_BITS)) 286 287 # Ensure only one of -m32 or -m64 is being used and place it first. 288 LOCAL_CFLAGS := \ 289 -m$$(LOCAL_MODULE_BITS) \ 290 $$(filter-out -m32 -m64, $$(LOCAL_CFLAGS)) 291 292 LOCAL_LDFLAGS := \ 293 -m$$(LOCAL_MODULE_BITS) \ 294 $$(filter-out -m32 -m64, $$(LOCAL_LDFLAGS)) 295 296 endef 297 298 # The common libraries 299 # 300 QEMU_SYSTEM_LDLIBS := -lm 301 ifeq ($(HOST_OS),windows) 302 QEMU_SYSTEM_LDLIBS += -mwindows -mconsole 303 endif 304 305 ifeq ($(HOST_OS),freebsd) 306 QEMU_SYSTEM_LDLIBS += -L/usr/local/lib -lpthread -lX11 -lutil 307 endif 308 309 ifeq ($(HOST_OS),linux) 310 QEMU_SYSTEM_LDLIBS += -lutil -lrt 311 endif 312 313 ifeq ($(HOST_OS),windows) 314 # amd64-mingw32msvc- toolchain still name it ws2_32. May change it once amd64-mingw32msvc- 315 # is stabilized 316 QEMU_SYSTEM_LDLIBS += -lwinmm -lws2_32 -liphlpapi 317 else 318 QEMU_SYSTEM_LDLIBS += -lpthread 319 endif 320 321 ifeq ($(HOST_OS),darwin) 322 QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa,-framework,QTKit,-framework,CoreVideo 323 324 # Required to avoid compilation errors when targetting i386 with newer 325 # XCode toolchain. 326 MY_LDFLAGS32 += -Wl,-read_only_relocs,suppress 327 328 # SDK 10.6+ doesn't have __dyld_func_lookup anymore. Dynamic library lookup symbols 329 # are instead resolved at runtime 330 OSX_VERSION_MAJOR := $(shell echo $(mac_sdk_version) | cut -d . -f 2) 331 OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6 := $(shell [ $(OSX_VERSION_MAJOR) -ge 6 ] && echo true) 332 ifeq ($(OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6),true) 333 QEMU_SYSTEM_LDLIBS += -undefined dynamic_lookup 334 endif 335 endif 336 337 # Build libext4_utils and related modules/ 338 include $(LOCAL_PATH)/distrib/zlib-1.2.8/sources.make 339 include $(LOCAL_PATH)/distrib/libsparse/sources.mk 340 include $(LOCAL_PATH)/distrib/libselinux/sources.mk 341 include $(LOCAL_PATH)/distrib/ext4_utils/sources.mk 342 343 include $(LOCAL_PATH)/Makefile.common 344 345 ifeq ($(HOST_OS),windows) 346 # on Windows, link the icon file as well into the executable 347 # unfortunately, our build system doesn't help us much, so we need 348 # to use some weird pathnames to make this work... 349 350 # Locate windres executable 351 WINDRES := windres 352 ifneq ($(USE_MINGW),) 353 # When building the Windows emulator under Linux, use the MinGW one 354 WINDRES := i586-mingw32msvc-windres 355 endif 356 357 # Usage: $(eval $(call insert-windows-icon)) 358 define insert-windows-icon 359 LOCAL_PREBUILT_OBJ_FILES += images/emulator_icon.o 360 endef 361 362 # This seems to be the only way to add an object file that was not generated from 363 # a C/C++/Java source file to our build system. and very unfortunately, 364 # $(TOPDIR)/$(LOCALPATH) will always be prepended to this value, which forces 365 # us to put the object file in the source directory. 366 $(LOCAL_PATH)/images/emulator_icon.o: $(LOCAL_PATH)/images/android_icon.rc 367 $(WINDRES) $< -I $(LOCAL_PATH)/images -o $@ 368 endif 369 370 # We want to build all variants of the emulator binaries. This makes 371 # it easier to catch target-specific regressions during emulator development. 372 EMULATOR_TARGET_ARCH := arm 373 include $(LOCAL_PATH)/Makefile.target 374 375 # Note: the same binary handles x86 and x86_64 376 EMULATOR_TARGET_ARCH := x86 377 include $(LOCAL_PATH)/Makefile.target 378 379 EMULATOR_TARGET_ARCH := mips 380 include $(LOCAL_PATH)/Makefile.target 381 382 EMULATOR_TARGET_ARCH := arm64 383 include $(LOCAL_PATH)/Makefile.qemu-launcher 384 385 ############################################################################## 386 ############################################################################## 387 ### 388 ### emulator: LAUNCHER FOR TARGET-SPECIFIC EMULATOR 389 ### 390 ### 391 $(call start-emulator-program, emulator) 392 393 LOCAL_SRC_FILES := android/main-emulator.c 394 LOCAL_STATIC_LIBRARIES := emulator-common 395 396 ifeq ($(HOST_OS),windows) 397 $(eval $(call insert-windows-icon)) 398 endif 399 400 $(call end-emulator-program) 401 402 include $(LOCAL_PATH)/Makefile.tests 403 404 ############################################################################## 405 ############################################################################## 406 ### 407 ### GPU emulation libraries 408 ### 409 ### Build directly from sources when using the standalone build. 410 ### 411 ifeq (true,$(BUILD_STANDALONE_EMULATOR)) 412 ifeq (,$(strip $(wildcard $(EMULATOR_EMUGL_SOURCES_DIR)))) 413 $(error Cannot find GPU emulation sources directory: $(EMULATOR_EMUGL_SOURCES_DIR)) 414 endif 415 416 # TODO(digit): Remove the line below. 417 BUILD_EMULATOR_OPENGL := true 418 BUILD_EMULATOR_HOST_OPENGL := true 419 include $(EMULATOR_EMUGL_SOURCES_DIR)/Android.mk 420 endif 421 422 ## VOILA!! 423 424 endif # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true 425