| 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 |
| |
| # This defines EMULATOR_BUILD_64BITS to indicate that 64-bit binaries |
| # must be generated by the build system. For now, only do it for |
| # Linux and Darwin, since we the sources do not compile with Mingw-w64 |
| # yet due to differing procedure call ABI conventions. |
| EMULATOR_BUILD_64BITS := $(strip $(filter linux darwin,$(HOST_OS))) |
| |
| # Disable 64-bit build for Darwin platform builds. |
| ifeq ($(HOST_OS),darwin) |
| ifneq (true,$(BUILD_STANDALONE_EMULATOR)) |
| EMULATOR_BUILD_64BITS := $(strip $(empty)) |
| endif # BUILD_STANDALONE_EMULATOR != true |
| endif # HOST_OS == darwin |
| |
| # A function that includes a file only if 32-bit binaries are necessary. |
| # This is always the case, but later used with include-if-bitness-64. |
| # $1: Build file to include. |
| include-if-bitness-32 = $(eval include $1) |
| |
| # A function that includes a file only of EMULATOR_BUILD_64BITS is not empty. |
| # $1: Build file to include. |
| include-if-bitness-64 = $(if $(strip $(EMULATOR_BUILD_64BITS)),$(eval include $1)) |
| |
| # 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_LD := $(HOST_LD) |
| MY_AR := $(HOST_AR) |
| |
| MY_CFLAGS := $(CONFIG_INCLUDES) -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 |
| MY_CFLAGS += -D_WIN32 |
| # LARGEADDRESSAWARE gives more address space to 32-bit process |
| MY_LDFLAGS32 += -Xlinker --large-address-aware |
| ifneq ($(HOST_IS_64_BIT),) |
| # 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 += -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 |
| |
| # 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 |
| |
| # 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 HOST_IS_64_BIT=true) |
| # 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/gcc/linux-x86/host/x86_64-linux-glibc2.11-4.6/bin/x86_64-linux- |
| ifeq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)gcc))) |
| # fallback to the previous host toolchain if new one isn't available |
| HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk/ |
| endif |
| # 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 |
| endif |
| |
| |
| ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true) |
| 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 |
| endif |
| |
| ifeq ($(HOST_OS)-$(BUILD_STANDALONE_EMULATOR),windows-true) |
| # 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_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 |
| |
| ifneq (true,$(BUILD_STANDALONE_EMULATOR)) |
| my-host-tool = $(MY_$1) |
| else |
| my-host-tool = $(if $(strip $(LOCAL_HOST_BUILD)),$(BUILD_$1),$(MY_$1)) |
| endif |
| |
| # 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) |
| |
| 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)) \ |
| $(call include-if-bitness-$(LOCAL_MODULE_BITS), $(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) |
| |
| 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)) \ |
| $(call include-if-bitness-$(LOCAL_MODULE_BITS), $(BUILD_HOST_EXECUTABLE)) |
| |
| 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)) |
| |
| 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 |
| |
| # 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 |
| |
| 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 |
| |
| # 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: 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 |
| |
| ############################################################################## |
| ############################################################################## |
| ### |
| ### GPU emulation libraries |
| ### |
| ### Build directly from sources when using the standalone build. |
| ### |
| ifeq (true,$(BUILD_STANDALONE_EMULATOR)) |
| 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 |
| include $(EMULATOR_EMUGL_SOURCES_DIR)/Android.mk |
| endif |
| |
| ## VOILA!! |
| |
| endif # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true |