1ifneq ($(filter true% %true,$(BUILD_EMULATOR)$(BUILD_STANDALONE_EMULATOR)),) 2 3ifneq (,$(filter $(TARGET_ARCH),arm x86 mips)) 4LOCAL_PATH:= $(call my-dir) 5 6# determine the target cpu 7ifeq ($(TARGET_ARCH),arm) 8EMULATOR_TARGET_CPU := target-arm 9endif 10ifeq ($(TARGET_ARCH),x86) 11EMULATOR_TARGET_CPU := target-i386 12endif 13ifeq ($(TARGET_ARCH),mips) 14EMULATOR_TARGET_CPU := target-mips 15endif 16 17# determine the host tag to use 18QEMU_HOST_TAG := $(HOST_PREBUILT_TAG) 19ifneq ($(USE_MINGW),) 20 QEMU_HOST_TAG := windows 21endif 22 23# determine the location of platform-specific directories 24# 25CONFIG_DIRS := \ 26 $(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG) 27 28ifeq ($(BUILD_STANDALONE_EMULATOR),true) 29 CONFIG_DIRS := $(LOCAL_PATH)/objs $(CONFIG_DIRS) 30endif 31 32CONFIG_INCLUDES := $(CONFIG_DIRS:%=-I%) 33 34MY_CC := $(HOST_CC) 35MY_CXX := $(HOST_CXX) 36MY_AR := $(HOST_AR) 37 38MY_CFLAGS := $(CONFIG_INCLUDES) -O2 -g -fno-PIC -falign-functions=0 -fomit-frame-pointer 39 40# Overwrite configuration for debug builds. 41# 42ifeq ($(BUILD_DEBUG_EMULATOR),true) 43 MY_CFLAGS := $(CONFIG_INCLUDES) 44 MY_CFLAGS += -O0 -g 45 MY_CFLAGS += -fno-PIC -falign-functions=0 46endif 47 48MY_LDLIBS := 49 50ifeq ($(HOST_OS),freebsd) 51 MY_CFLAGS += -I /usr/local/include 52endif 53 54ifeq ($(HOST_OS),windows) 55 # we need Win32 features that are available since Windows 2000 Professional/Server (NT 5.0) 56 MY_CFLAGS += -DWINVER=0x501 57 MY_CFLAGS += -D_WIN32 58 ifneq ($(BUILD_HOST_64bit),) 59 # Microsoft 64-bit compiler define both _WIN32 and _WIN64 60 MY_CFLAGS += -D_WIN64 61 # amd64-mingw32msvc- toolchain still name it vfw32. May change it once amd64-mingw32msvc- 62 # is stabilized 63 MY_LDLIBS += -lvfw32 64 else 65 MY_LDLIBS += -lvfw32 66 endif 67endif 68 69ifeq ($(HOST_ARCH),ppc) 70 MY_CFLAGS += -D__powerpc__ 71endif 72 73ifeq ($(HOST_OS),darwin) 74 MY_CFLAGS += -mdynamic-no-pic -D_DARWIN_C_SOURCE=1 75 76 MY_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version) 77 MY_LDLIBS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) 78 79endif 80 81# BUILD_STANDALONE_EMULATOR is only defined when building with 82# the android-rebuild.sh script. The script will also provide 83# adequate values for HOST_CC 84# 85ifneq ($(BUILD_STANDALONE_EMULATOR),true) 86 # On Linux, use our custom 32-bit host toolchain (unless BUILD_HOST_64bit=1) 87 # which contains the relevant headers and 32-bit libraries for audio (The host 64-bit 88 # Lucid doesn't provide these anymore, only their 64-bit versions). 89 ifeq ($(HOST_OS),linux) 90 HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk 91 # Don't do anything if the toolchain is not there 92 ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc))) 93 MY_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc 94 MY_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)/g++ 95 MY_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)/ar 96 endif # $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc exists 97 endif # HOST_OS == linux 98 99 ifneq ($(USE_CCACHE),) 100 ccache := prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache 101 ccache := $(strip $(wildcard $(ccache))) 102 ifneq ($(ccache),$(firstword $(MY_CC))) 103 MY_CC := $(ccache) $(MY_CC) 104 MY_CXX := $(ccache) $(MY_CXX) 105 endif 106 ccache := 107 endif 108 109 QEMU_OPENGLES_INCLUDE := sdk/emulator/opengl/host/include 110 QEMU_OPENGLES_LIBS := $(HOST_OUT) 111endif 112 113 114ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true) 115 ifneq ($(BUILD_HOST_64bit),) 116 MY_CFLAGS += -m64 117 MY_LDLIBS += -m64 118 else 119 ifneq ($(HOST_ARCH),x86_64) 120 MY_CFLAGS += -m32 121 MY_LDLIBS += -m32 122 endif 123 endif 124 125 ifneq ($(BUILD_HOST_static),) 126 MY_LDLIBS += -static 127 endif 128endif 129 130# Enable warning, except those related to missing field initializers 131# (the QEMU coding style loves using these). 132# 133MY_CFLAGS += -Wall -Wno-missing-field-initializers 134 135# Needed to build fpu/softfloat-native.h properly 136MY_CFLAGS += -D_GNU_SOURCE=1 137 138# A useful function that can be used to start the declaration of a host 139# module. Avoids repeating the same stuff again and again. 140# Usage: 141# 142# $(call start-emulator-library, <module-name>) 143# 144# ... declarations 145# 146# $(call end-emulator-library) 147# 148start-emulator-library = \ 149 $(eval include $(CLEAR_VARS)) \ 150 $(eval LOCAL_NO_DEFAULT_COMPILER_FLAGS := true) \ 151 $(eval LOCAL_CC := $(MY_CC)) \ 152 $(eval LOCAL_CXX := $(MY_CXX)) \ 153 $(eval LOCAL_CFLAGS := $(MY_CFLAGS)) \ 154 $(eval LOCAL_AR := $(MY_AR)) \ 155 $(eval LOCAL_LDLIBS := $(MY_LDLIBS)) \ 156 $(eval LOCAL_MODULE := $1) \ 157 $(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES) 158 159# Used with start-emulator-library 160end-emulator-library = \ 161 $(eval include $(BUILD_HOST_STATIC_LIBRARY)) 162 163# A variant of start-emulator-library to start the definition of a host 164# program instead. Use with end-emulator-program 165start-emulator-program = \ 166 $(call start-emulator-library,$1) \ 167 $(eval LOCAL_MODULE_CLASS := EXECUTABLES) 168 169# A varient of end-emulator-library for host programs instead 170end-emulator-program = \ 171 $(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \ 172 $(eval include $(BUILD_HOST_EXECUTABLE)) 173 174 175# The common libraries 176# 177QEMU_SYSTEM_LDLIBS := -lm 178ifeq ($(HOST_OS),windows) 179 QEMU_SYSTEM_LDLIBS += -mno-cygwin -mwindows -mconsole 180endif 181 182ifeq ($(HOST_OS),freebsd) 183 QEMU_SYSTEM_LDLIBS += -L/usr/local/lib -lpthread -lX11 -lutil 184endif 185 186ifeq ($(HOST_OS),linux) 187 QEMU_SYSTEM_LDLIBS += -lutil -lrt 188endif 189 190ifeq ($(HOST_OS),windows) 191 # amd64-mingw32msvc- toolchain still name it ws2_32. May change it once amd64-mingw32msvc- 192 # is stabilized 193 QEMU_SYSTEM_LDLIBS += -lwinmm -lws2_32 -liphlpapi 194else 195 QEMU_SYSTEM_LDLIBS += -lpthread 196endif 197 198ifeq ($(HOST_OS),darwin) 199 QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa,-framework,QTKit,-framework,CoreVideo 200 201 # SDK 10.6+ doesn't have __dyld_func_lookup anymore. Dynamic library lookup symbols 202 # are instead resolved at runtime 203 OSX_VERSION_MAJOR := $(shell echo $(mac_sdk_version) | cut -d . -f 2) 204 OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6 := $(shell [ $(OSX_VERSION_MAJOR) -ge 6 ] && echo true) 205 ifeq ($(OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6),true) 206 QEMU_SYSTEM_LDLIBS += -undefined dynamic_lookup 207 endif 208endif 209 210include $(LOCAL_PATH)/Makefile.common 211 212ifeq ($(HOST_OS),windows) 213 # on Windows, link the icon file as well into the executable 214 # unfortunately, our build system doesn't help us much, so we need 215 # to use some weird pathnames to make this work... 216 217 # Locate windres executable 218 WINDRES := windres 219 ifneq ($(USE_MINGW),) 220 # When building the Windows emulator under Linux, use the MinGW one 221 WINDRES := i586-mingw32msvc-windres 222 endif 223 224 # Usage: $(eval $(call insert-windows-icon)) 225 define insert-windows-icon 226 LOCAL_PREBUILT_OBJ_FILES += images/emulator_icon.o 227 endef 228 229# This seems to be the only way to add an object file that was not generated from 230# a C/C++/Java source file to our build system. and very unfortunately, 231# $(TOPDIR)/$(LOCALPATH) will always be prepended to this value, which forces 232# us to put the object file in the source directory. 233$(LOCAL_PATH)/images/emulator_icon.o: $(LOCAL_PATH)/images/android_icon.rc 234 $(WINDRES) $< -I $(LOCAL_PATH)/images -o $@ 235endif 236 237# We want to build all variants of the emulator binaries. This makes 238# it easier to catch target-specific regressions during emulator development. 239EMULATOR_TARGET_ARCH := arm 240include $(LOCAL_PATH)/Makefile.target 241 242EMULATOR_TARGET_ARCH := x86 243include $(LOCAL_PATH)/Makefile.target 244 245EMULATOR_TARGET_ARCH := mips 246include $(LOCAL_PATH)/Makefile.target 247 248############################################################################## 249############################################################################## 250### 251### emulator: LAUNCHER FOR TARGET-SPECIFIC EMULATOR 252### 253### 254$(call start-emulator-program, emulator) 255 256LOCAL_SRC_FILES := android/main-emulator.c 257LOCAL_STATIC_LIBRARIES := emulator-common 258 259ifeq ($(HOST_OS),windows) 260$(eval $(call insert-windows-icon)) 261endif 262 263$(call end-emulator-program) 264 265############################################################################## 266############################################################################## 267### 268### emulator-ui: UI FRONT-END PROGRAM 269### 270### 271$(call start-emulator-program, emulator-ui) 272 273LOCAL_STATIC_LIBRARIES := \ 274 emulator-common \ 275 emulator-libui \ 276 emulator-common \ 277 278LOCAL_CFLAGS += -DCONFIG_STANDALONE_UI=1 279 280LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) $(EMULATOR_LIBUI_CFLAGS) 281LOCAL_LDLIBS += $(EMULATOR_COMMON_LDLIBS) $(EMULATOR_LIBUI_LDLIBS) 282 283LOCAL_SRC_FILES := \ 284 android/cmdline-option.c \ 285 android/config.c \ 286 android/help.c \ 287 android/looper-generic.c \ 288 android/snapshot.c \ 289 android/main-common.c \ 290 android/main.c \ 291 android/opengles.c \ 292 android/utils/setenv.c \ 293 vl-android-ui.c \ 294 android/protocol/core-connection.c \ 295 android/protocol/attach-ui-impl.c \ 296 android/protocol/fb-updates-impl.c \ 297 android/protocol/ui-commands-impl.c \ 298 android/protocol/core-commands-proxy.c \ 299 android/protocol/user-events-proxy.c \ 300 301$(call gen-hw-config-defs,android/main-common.c) 302 303LOCAL_SRC_FILES += $(SDLMAIN_SOURCES) 304 305LOCAL_STATIC_LIBRARIES += $(SDL_STATIC_LIBRARIES) 306 307$(call end-emulator-program) 308 309## VOILA!! 310 311endif # TARGET_ARCH == arm || TARGET_ARCH == x86 || TARGET_ARCH == mips 312endif # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true 313