blob: 7af2b48d9a972a814cc698792c7cdbe53d7a26c9 [file] [log] [blame]
ifneq ($(filter true% %true,$(BUILD_EMULATOR)$(BUILD_STANDALONE_EMULATOR)),)
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
# determine the location of platform-specific directories
#
CONFIG_DIRS := \
$(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG)
ifeq ($(BUILD_STANDALONE_EMULATOR),true)
CONFIG_DIRS := $(LOCAL_PATH)/objs $(CONFIG_DIRS)
endif
CONFIG_INCLUDES := $(CONFIG_DIRS:%=-I%)
MY_CC := $(HOST_CC)
MY_CXX := $(HOST_CXX)
MY_AR := $(HOST_AR)
MY_CFLAGS := $(CONFIG_INCLUDES) -O2 -g -fno-PIC -falign-functions=0 -fomit-frame-pointer
# Overwrite configuration for debug builds.
#
ifeq ($(BUILD_DEBUG_EMULATOR),true)
MY_CFLAGS := $(CONFIG_INCLUDES)
MY_CFLAGS += -O0 -g
MY_CFLAGS += -fno-PIC -falign-functions=0
endif
MY_LDLIBS :=
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
MY_CFLAGS += -D_WIN32
# LARGEADDRESSAWARE gives more address space to 32-bit process
MY_LDLIBS += -Xlinker --large-address-aware
ifneq ($(BUILD_HOST_64bit),)
# Microsoft 64-bit compiler define both _WIN32 and _WIN64
MY_CFLAGS += -D_WIN64
# amd64-mingw32msvc- toolchain still name it vfw32. May change it once amd64-mingw32msvc-
# is stabilized
MY_LDLIBS += -lvfw32
else
MY_LDLIBS += -lvfw32
endif
endif
ifeq ($(HOST_ARCH),ppc)
MY_CFLAGS += -D__powerpc__
endif
ifeq ($(HOST_OS),darwin)
MY_CFLAGS += -D_DARWIN_C_SOURCE=1
ifneq ($(host_toolchain_header),)
MY_CFLAGS += -mdynamic-no-pic
MY_CFLAGS += -isystem $(host_toolchain_header)
else
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
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
# BUILD_STANDALONE_EMULATOR is only defined when building with
# the android-rebuild.sh script. The script will also provide
# adequate values for HOST_CC
#
ifneq ($(BUILD_STANDALONE_EMULATOR),true)
# On Linux, use our custom 32-bit host toolchain (unless BUILD_HOST_64bit=1)
# which contains the relevant headers and 32-bit libraries for audio (The host 64-bit
# Lucid doesn't provide these anymore, only their 64-bit versions).
ifeq ($(HOST_OS),linux)
HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk
# Don't do anything if the toolchain is not there
ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc)))
MY_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc
MY_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)/g++
MY_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)/ar
endif # $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc exists
endif # HOST_OS == linux
ifneq ($(USE_CCACHE),)
ccache := prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache
ccache := $(strip $(wildcard $(ccache)))
ifneq ($(ccache),$(firstword $(MY_CC)))
MY_CC := $(ccache) $(MY_CC)
MY_CXX := $(ccache) $(MY_CXX)
endif
ccache :=
endif
QEMU_OPENGLES_INCLUDE := sdk/emulator/opengl/host/include
QEMU_OPENGLES_LIBS := $(HOST_OUT)
endif
ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true)
ifneq ($(BUILD_HOST_64bit),)
MY_CFLAGS += -m64
MY_LDLIBS += -m64
else
ifneq ($(HOST_ARCH),x86_64)
MY_CFLAGS += -m32
MY_LDLIBS += -m32
endif
endif
ifneq ($(BUILD_HOST_static),)
MY_LDLIBS += -static
endif
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)
# Needed to build block.c on Linux/x86_64.
MY_CFLAGS += -D_GNU_SOURCE=1
MY_CFLAGS += -I$(LOCAL_PATH)/include
# Need to include "qapi-types.h" and other auto-generated files from
# android-configure.sh
MY_CFLAGS += -I$(LOCAL_PATH)/qapi-auto-generated
# 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_CC := $(MY_CC)) \
$(eval LOCAL_CXX := $(MY_CXX)) \
$(eval LOCAL_CFLAGS := $(MY_CFLAGS)) \
$(eval LOCAL_AR := $(MY_AR)) \
$(eval LOCAL_LDLIBS := $(MY_LDLIBS)) \
$(eval LOCAL_MODULE := $1) \
$(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES)
# Used with start-emulator-library
end-emulator-library = \
$(eval include $(BUILD_HOST_STATIC_LIBRARY))
# 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)
# A varient of end-emulator-library for host programs instead
end-emulator-program = \
$(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \
$(eval include $(BUILD_HOST_EXECUTABLE))
# The common libraries
#
QEMU_SYSTEM_LDLIBS := -lm
ifeq ($(HOST_OS),windows)
QEMU_SYSTEM_LDLIBS += -mno-cygwin -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
# 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
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...
# Locate windres executable
WINDRES := windres
ifneq ($(USE_MINGW),)
# When building the Windows emulator under Linux, use the MinGW one
WINDRES := i586-mingw32msvc-windres
endif
# Usage: $(eval $(call insert-windows-icon))
define insert-windows-icon
LOCAL_PREBUILT_OBJ_FILES += images/emulator_icon.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_icon.o: $(LOCAL_PATH)/images/android_icon.rc
$(WINDRES) $< -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
EMULATOR_TARGET_ARCH := x86
include $(LOCAL_PATH)/Makefile.target
EMULATOR_TARGET_ARCH := mips
include $(LOCAL_PATH)/Makefile.target
##############################################################################
##############################################################################
###
### emulator: LAUNCHER FOR TARGET-SPECIFIC EMULATOR
###
###
$(call start-emulator-program, emulator)
LOCAL_SRC_FILES := android/main-emulator.c
LOCAL_STATIC_LIBRARIES := emulator-common
ifeq ($(HOST_OS),windows)
$(eval $(call insert-windows-icon))
endif
$(call end-emulator-program)
include $(LOCAL_PATH)/Makefile.tests
## VOILA!!
endif # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true