blob: abebaae474314bbb572e5381d2c902d34acb8734 [file] [log] [blame]
LOCAL_PATH:= $(call my-dir)
# determine the host tag to use
QEMU_HOST_TAG := $(HOST_PREBUILT_TAG)
ifneq ($(USE_MINGW),)
QEMU_HOST_TAG := windows
endif
# This defines EMULATOR_BUILD_32BITS to indicate that 32-bit binaries
# must be generated by the build system. For now, only for Windows because
# the Win64 do not work yet properly (e.g. can't emulate 32-bit ARM), and
# Linux (because the 32-bit binaries are deprecated, but not obsolete).
EMULATOR_BUILD_32BITS := $(strip $(filter windows linux,$(HOST_OS)))
# This defines EMULATOR_BUILD_64BITS to indicate that 64-bit binaries
# must be generated by the build system. For now, only do it for
# Windows, Linux and Darwin.
EMULATOR_BUILD_64BITS := $(strip $(filter linux darwin windows,$(HOST_OS)))
# EMULATOR_PROGRAM_BITNESS is the bitness of the 'emulator' launcher program.
# It will be 32 if we allow 32-bit binaries to be built, 64 otherwise.
ifneq (,$(EMULATOR_BUILD_32BITS))
EMULATOR_PROGRAM_BITNESS := 32
else
EMULATOR_PROGRAM_BITNESS := 64
endif
# A function that includes a file only if 32-bit binaries are necessary,
# or if LOCAL_IGNORE_BITNESS is defined for the current module.
# $1: Build file to include.
include-if-bitness-32 = \
$(if $(strip $(LOCAL_IGNORE_BITNESS)$(filter true,$(LOCAL_HOST_BUILD))$(EMULATOR_BUILD_32BITS)),\
$(eval include $1))
# A function that includes a file only of EMULATOR_BUILD_64BITS is not empty.
# or if LOCAL_IGNORE_BITNESS is defined for the current module.
# $1: Build file to include.
include-if-bitness-64 = \
$(if $(strip $(LOCAL_IGNORE_BITNESS)$(filter true,$(LOCAL_HOST_BUILD))$(EMULATOR_BUILD_64BITS)),\
$(eval include $1))
# determine the location of platform-specific directories
#
QEMU_CONFIG_DIRS := \
$(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG)
QEMU_CONFIG_DIRS := $(LOCAL_PATH)/objs $(QEMU_CONFIG_DIRS)
QEMU_CONFIG_INCLUDES := $(QEMU_CONFIG_DIRS:%=-I%)
MY_CC := $(HOST_CC)
MY_CXX := $(HOST_CXX)
MY_LD := $(HOST_LD)
MY_AR := $(HOST_AR)
MY_WINDRES := $(HOST_WINDRES)
MY_CFLAGS := -g -falign-functions=0
ifeq ($(BUILD_DEBUG_EMULATOR),true)
MY_CFLAGS += -O0
else
MY_CFLAGS += -O2
endif
# Generate position-independent binaries. Don't add -fPIC when targetting
# Windows, because newer toolchain complain loudly about it, since all
# Windows code is position-independent.
ifneq (windows,$(HOST_OS))
MY_CFLAGS += -fPIC
endif
MY_CFLAGS32 :=
MY_CFLAGS64 :=
MY_LDLIBS :=
MY_LDLIBS32 :=
MY_LDLIBS64 :=
MY_LDFLAGS :=
MY_LDFLAGS32 :=
MY_LDFLAGS64 :=
ifeq ($(HOST_OS),freebsd)
MY_CFLAGS += -I /usr/local/include
endif
ifeq ($(HOST_OS),windows)
# we need Win32 features that are available since Windows 2000 Professional/Server (NT 5.0)
MY_CFLAGS += -DWINVER=0x501
# LARGEADDRESSAWARE gives more address space to 32-bit process
MY_LDFLAGS32 += -Xlinker --large-address-aware
endif
ifeq ($(HOST_ARCH),ppc)
MY_CFLAGS += -D__powerpc__
endif
ifeq ($(HOST_OS),darwin)
MY_CFLAGS += -D_DARWIN_C_SOURCE=1
ifneq (,$(mac_sdk_root))
MY_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version)
MY_LDLIBS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version)
# Clang complains about this flag being not useful anymore.
MY_CFLAGS := $(filter-out -falign-functions=0,$(MY_CFLAGS))
endif
endif
# NOTE: The following definitions are only used by the standalone build.
MY_EXEEXT :=
MY_DLLEXT := .so
ifeq ($(HOST_OS),windows)
MY_EXEEXT := .exe
MY_DLLEXT := .dll
endif
ifeq ($(HOST_OS),darwin)
MY_DLLEXT := .dylib
endif
# Some CFLAGS below use -Wno-missing-field-initializers but this is not
# supported on GCC 3.x which is still present under Cygwin.
# Find out by probing GCC for support of this flag. Note that the test
# itself only works on GCC 4.x anyway.
GCC_W_NO_MISSING_FIELD_INITIALIZERS := -Wno-missing-field-initializers
ifeq ($(HOST_OS),windows)
ifeq (,$(shell gcc -Q --help=warnings 2>/dev/null | grep missing-field-initializers))
$(info emulator: Ignoring unsupported GCC flag $(GCC_W_NO_MISSING_FIELD_INITIALIZERS))
GCC_W_NO_MISSING_FIELD_INITIALIZERS :=
endif
endif
ifneq ($(HOST_IS_64_BIT),)
MY_CFLAGS += -m64
MY_LDFLAGS += -m64
else
ifneq ($(HOST_ARCH),x86_64)
MY_CFLAGS += -m32
MY_LDFLAGS += -m32
endif
endif
ifneq ($(BUILD_HOST_static),)
MY_LDLIBS += -static
endif
ifeq ($(HOST_OS),windows)
# Ensure that printf() et al use GNU printf format specifiers as required
# by QEMU. This is important when using the newer Mingw64 cross-toolchain.
# See http://sourceforge.net/apps/trac/mingw-w64/wiki/gnu%20printf
MY_CFLAGS += -D__USE_MINGW_ANSI_STDIO=1
endif
# Enable warning, except those related to missing field initializers
# (the QEMU coding style loves using these).
#
MY_CFLAGS += -Wall $(GCC_W_NO_MISSING_FIELD_INITIALIZERS)
# When using clang and ccache, disable the spammy warnings about unused
# parameters during compilation, and re-enable colored output.
#
# See http://petereisentraut.blogspot.fr/2011/05/ccache-and-clang.html
ifneq (,$(filter %ccache,$(MY_CC)))
ifneq (,$(filter LLVM,$(shell $(HOST_CC) -v 2>&1)))
MY_CFLAGS := -Qunused-arguments -fcolor-diagnostics $(MY_CFLAGS)
endif
endif
# Needed to build block.c on Linux/x86_64.
MY_CFLAGS += -D_GNU_SOURCE=1
my-host-tool = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_$1),$(MY_$1))
# A useful function that can be used to start the declaration of a host
# module. Avoids repeating the same stuff again and again.
# Usage:
#
# $(call start-emulator-library, <module-name>)
#
# ... declarations
#
# $(call end-emulator-library)
#
start-emulator-library = \
$(eval include $(CLEAR_VARS)) \
$(eval LOCAL_NO_DEFAULT_COMPILER_FLAGS := true) \
$(eval LOCAL_MODULE := $1) \
$(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES) \
$(eval LOCAL_MODULE_BITS := 32) \
$(eval LOCAL_BUILD_FILE := $(BUILD_HOST_STATIC_LIBRARY))
start-emulator64-library = \
$(call start-emulator-library, $1) \
$(eval LOCAL_MODULE_BITS := 64)
# Used with start-emulator-library
end-emulator-library = \
$(eval $(end-emulator-module-ev)) \
define-emulator-prebuilt-library = \
$(call start-emulator-library,$1) \
$(eval LOCAL_BUILD_FILE := $(PREBUILT_STATIC_LIBRARY)) \
$(eval LOCAL_SRC_FILES := $2) \
$(eval $(end-emulator-module-ev)) \
define-emulator64-prebuilt-library = \
$(call start-emulator64-library,$1) \
$(eval LOCAL_BUILD_FILE := $(PREBUILT_STATIC_LIBRARY)) \
$(eval LOCAL_SRC_FILES := $2) \
$(eval $(end-emulator-module-ev)) \
# A variant of start-emulator-library to start the definition of a host
# program instead. Use with end-emulator-program
start-emulator-program = \
$(call start-emulator-library,$1) \
$(eval LOCAL_MODULE_CLASS := EXECUTABLES) \
$(eval LOCAL_BUILD_FILE := $(BUILD_HOST_EXECUTABLE))
start-emulator64-program = \
$(call start-emulator-program, $1) \
$(eval LOCAL_MODULE_BITS := 64)
# A varient of end-emulator-library for host programs instead
end-emulator-program = \
$(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \
$(eval $(end-emulator-module-ev)) \
define end-emulator-module-ev
LOCAL_CC := $$(call my-host-tool,CC)
LOCAL_CXX := $$(call my-host-tool,CXX)
LOCAL_AR := $$(call my-host-tool,AR)
LOCAL_LD := $$(call my-host-tool,LD)
LOCAL_CFLAGS := \
$$(call my-host-tool,CFLAGS$$(LOCAL_MODULE_BITS)) \
$$(call my-host-tool,CFLAGS) \
$$(LOCAL_CFLAGS)
LOCAL_LDFLAGS := \
$$(call my-host-tool,LDFLAGS$$(LOCAL_MODULE_BITS)) \
$$(call my-host-tool,LDFLAGS) \
$$(LOCAL_LDFLAGS)
LOCAL_LDLIBS := \
$$(LOCAL_LDLIBS) \
$$(call my-host-tool,LDLIBS) \
$$(call my-host-tool,LDLIBS$$(LOCAL_MODULE_BITS))
# Ensure only one of -m32 or -m64 is being used and place it first.
LOCAL_CFLAGS := \
-m$$(LOCAL_MODULE_BITS) \
$$(filter-out -m32 -m64, $$(LOCAL_CFLAGS))
LOCAL_LDFLAGS := \
-m$$(LOCAL_MODULE_BITS) \
$$(filter-out -m32 -m64, $$(LOCAL_LDFLAGS))
$$(call include-if-bitness-$$(LOCAL_MODULE_BITS), $$(LOCAL_BUILD_FILE))
endef
# The common libraries
#
QEMU_SYSTEM_LDLIBS := -lm
ifeq ($(HOST_OS),windows)
QEMU_SYSTEM_LDLIBS += -mwindows -mconsole
endif
ifeq ($(HOST_OS),freebsd)
QEMU_SYSTEM_LDLIBS += -L/usr/local/lib -lpthread -lX11 -lutil
endif
ifeq ($(HOST_OS),linux)
QEMU_SYSTEM_LDLIBS += -lutil -lrt
endif
ifeq ($(HOST_OS),windows)
# amd64-mingw32msvc- toolchain still name it ws2_32. May change it once amd64-mingw32msvc-
# is stabilized
QEMU_SYSTEM_LDLIBS += -lwinmm -lws2_32 -liphlpapi
else
QEMU_SYSTEM_LDLIBS += -lpthread
endif
ifeq ($(HOST_OS),darwin)
QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa,-framework,QTKit,-framework,CoreVideo,-framework,AVFoundation
# Required to avoid compilation errors when targetting i386 with newer
# XCode toolchain.
MY_LDFLAGS32 += -Wl,-read_only_relocs,suppress
# SDK 10.6+ doesn't have __dyld_func_lookup anymore. Dynamic library lookup symbols
# are instead resolved at runtime
OSX_VERSION_MAJOR := $(shell echo $(mac_sdk_version) | cut -d . -f 2)
OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6 := $(shell [ $(OSX_VERSION_MAJOR) -ge 6 ] && echo true)
ifeq ($(OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6),true)
QEMU_SYSTEM_LDLIBS += -undefined dynamic_lookup
endif
endif
# Build libext4_utils and related modules/
include $(LOCAL_PATH)/distrib/zlib-1.2.8/sources.make
include $(LOCAL_PATH)/distrib/libsparse/sources.mk
include $(LOCAL_PATH)/distrib/libselinux/sources.mk
include $(LOCAL_PATH)/distrib/ext4_utils/sources.mk
include $(LOCAL_PATH)/Makefile.common
ifeq ($(HOST_OS),windows)
# on Windows, link the icon file as well into the executable
# unfortunately, our build system doesn't help us much, so we need
# to use some weird pathnames to make this work...
# Usage: $(eval $(call insert-windows-icon))
define insert-windows-icon
LOCAL_PREBUILT_OBJ_FILES += images/emulator_icon$(LOCAL_MODULE_BITS).o
endef
# This seems to be the only way to add an object file that was not generated from
# a C/C++/Java source file to our build system. and very unfortunately,
# $(TOPDIR)/$(LOCALPATH) will always be prepended to this value, which forces
# us to put the object file in the source directory.
$(LOCAL_PATH)/images/emulator_icon32.o: $(LOCAL_PATH)/images/android_icon.rc
@echo "Windres (x86): $@"
$(MY_WINDRES) --target=pe-i386 $< -I $(LOCAL_PATH)/images -o $@
$(LOCAL_PATH)/images/emulator_icon64.o: $(LOCAL_PATH)/images/android_icon.rc
@echo "Windres (x86_64): $@"
$(MY_WINDRES) --target=pe-x86-64 $< -I $(LOCAL_PATH)/images -o $@
endif
# We want to build all variants of the emulator binaries. This makes
# it easier to catch target-specific regressions during emulator development.
EMULATOR_TARGET_ARCH := arm
include $(LOCAL_PATH)/Makefile.target
# Note: the same binary handles x86 and x86_64
EMULATOR_TARGET_ARCH := x86
include $(LOCAL_PATH)/Makefile.target
EMULATOR_TARGET_ARCH := mips
include $(LOCAL_PATH)/Makefile.target
EMULATOR_TARGET_ARCH := mips64
include $(LOCAL_PATH)/Makefile.qemu-launcher
EMULATOR_TARGET_ARCH := arm64
include $(LOCAL_PATH)/Makefile.qemu-launcher
##############################################################################
##############################################################################
###
### emulator: LAUNCHER FOR TARGET-SPECIFIC EMULATOR
###
# NOTE: Build as 32-bit or 64-bit executable, depending on the value of
# EMULATOR_PROGRAM_BITNESS.
ifeq (32,$(EMULATOR_PROGRAM_BITNESS))
$(call start-emulator-program, emulator)
else
$(call start-emulator64-program, emulator)
endif
LOCAL_SRC_FILES := \
android/main-emulator.c \
android/qt/qt_setup.cpp \
ifeq (32,$(EMULATOR_PROGRAM_BITNESS))
LOCAL_STATIC_LIBRARIES := emulator-common
# Ensure this is always built, even if 32-bit binaries are disabled.
LOCAL_IGNORE_BITNESS := true
else
LOCAL_STATIC_LIBRARIES := emulator64-common
endif
LOCAL_LDLIBS += -lstdc++
ifeq ($(HOST_OS),windows)
$(eval $(call insert-windows-icon))
endif
$(call end-emulator-program)
include $(LOCAL_PATH)/Makefile.tests
##############################################################################
##############################################################################
###
### GPU emulation libraries
###
### Build directly from sources when using the standalone build.
###
ifeq (,$(strip $(wildcard $(EMULATOR_EMUGL_SOURCES_DIR))))
$(error Cannot find GPU emulation sources directory: $(EMULATOR_EMUGL_SOURCES_DIR))
endif
# TODO(digit): Remove the line below.
BUILD_EMULATOR_OPENGL := true
BUILD_EMULATOR_HOST_OPENGL := true
ifeq (true,$(BUILD_DEBUG_EMULATOR))
EMUGL_BUILD_DEBUG := 1
endif
include $(EMULATOR_EMUGL_SOURCES_DIR)/Android.mk
## VOILA!!