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    ifneq ($(host_toolchain_header),)
76        MY_CFLAGS += -isystem $(host_toolchain_header)
77    endif
78    MY_CFLAGS += -isysroot $(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version) -DMACOSX_DEPLOYMENT_TARGET=$(mac_sdk_version)
79    MY_LDLIBS += -isysroot $(mac_sdk_root) -Wl,-syslibroot,$(mac_sdk_root) -mmacosx-version-min=$(mac_sdk_version)
80
81endif
82
83# Some CFLAGS below use -Wno-missing-field-initializers but this is not
84# supported on GCC 3.x which is still present under Cygwin.
85# Find out by probing GCC for support of this flag. Note that the test
86# itself only works on GCC 4.x anyway.
87GCC_W_NO_MISSING_FIELD_INITIALIZERS := -Wno-missing-field-initializers
88ifeq ($(HOST_OS),windows)
89    ifeq (,$(shell gcc -Q --help=warnings 2>/dev/null | grep missing-field-initializers))
90        $(info emulator: Ignoring unsupported GCC flag $(GCC_W_NO_MISSING_FIELD_INITIALIZERS))
91        GCC_W_NO_MISSING_FIELD_INITIALIZERS :=
92    endif
93endif
94
95# BUILD_STANDALONE_EMULATOR is only defined when building with
96# the android-rebuild.sh script. The script will also provide
97# adequate values for HOST_CC
98#
99ifneq ($(BUILD_STANDALONE_EMULATOR),true)
100  # On Linux, use our custom 32-bit host toolchain (unless BUILD_HOST_64bit=1)
101  # which contains the relevant headers and 32-bit libraries for audio (The host 64-bit
102  # Lucid doesn't provide these anymore, only their 64-bit versions).
103  ifeq ($(HOST_OS),linux)
104    HOST_SDK_TOOLCHAIN_PREFIX := prebuilts/tools/gcc-sdk
105    # Don't do anything if the toolchain is not there
106    ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc)))
107      MY_CC  := $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc
108      MY_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)/g++
109      MY_AR  := $(HOST_SDK_TOOLCHAIN_PREFIX)/ar
110    endif # $(HOST_SDK_TOOLCHAIN_PREFIX)/gcc exists
111  endif # HOST_OS == linux
112
113  ifneq ($(USE_CCACHE),)
114    ccache := prebuilts/misc/$(HOST_PREBUILT_TAG)/ccache/ccache
115    ccache := $(strip $(wildcard $(ccache)))
116    ifneq ($(ccache),$(firstword $(MY_CC)))
117      MY_CC := $(ccache) $(MY_CC)
118      MY_CXX := $(ccache) $(MY_CXX)
119    endif
120    ccache :=
121  endif
122
123  QEMU_OPENGLES_INCLUDE := sdk/emulator/opengl/host/include
124  QEMU_OPENGLES_LIBS := $(HOST_OUT)
125endif
126
127
128ifneq ($(combo_target)$(TARGET_SIMULATOR),HOST_true)
129  ifneq ($(BUILD_HOST_64bit),)
130    MY_CFLAGS += -m64
131    MY_LDLIBS += -m64
132  else
133    ifneq ($(HOST_ARCH),x86_64)
134      MY_CFLAGS += -m32
135      MY_LDLIBS += -m32
136    endif
137  endif
138
139  ifneq ($(BUILD_HOST_static),)
140    MY_LDLIBS += -static
141  endif
142endif
143
144# Enable warning, except those related to missing field initializers
145# (the QEMU coding style loves using these).
146#
147MY_CFLAGS += -Wall $(GCC_W_NO_MISSING_FIELD_INITIALIZERS)
148
149# Needed to build fpu/softfloat-native.h properly
150MY_CFLAGS += -D_GNU_SOURCE=1
151
152# A useful function that can be used to start the declaration of a host
153# module. Avoids repeating the same stuff again and again.
154# Usage:
155#
156#  $(call start-emulator-library, <module-name>)
157#
158#  ... declarations
159#
160#  $(call end-emulator-library)
161#
162start-emulator-library = \
163    $(eval include $(CLEAR_VARS)) \
164    $(eval LOCAL_NO_DEFAULT_COMPILER_FLAGS := true) \
165    $(eval LOCAL_CC := $(MY_CC)) \
166    $(eval LOCAL_CXX := $(MY_CXX)) \
167    $(eval LOCAL_CFLAGS := $(MY_CFLAGS)) \
168    $(eval LOCAL_AR := $(MY_AR)) \
169    $(eval LOCAL_LDLIBS := $(MY_LDLIBS)) \
170    $(eval LOCAL_MODULE := $1) \
171    $(eval LOCAL_MODULE_CLASS := STATIC_LIBRARIES)
172
173# Used with start-emulator-library
174end-emulator-library = \
175    $(eval include $(BUILD_HOST_STATIC_LIBRARY))
176
177# A variant of start-emulator-library to start the definition of a host
178# program instead. Use with end-emulator-program
179start-emulator-program = \
180    $(call start-emulator-library,$1) \
181    $(eval LOCAL_MODULE_CLASS := EXECUTABLES)
182
183# A varient of end-emulator-library for host programs instead
184end-emulator-program = \
185    $(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \
186    $(eval include $(BUILD_HOST_EXECUTABLE))
187
188
189# The common libraries
190#
191QEMU_SYSTEM_LDLIBS := -lm
192ifeq ($(HOST_OS),windows)
193  QEMU_SYSTEM_LDLIBS += -mno-cygwin -mwindows -mconsole
194endif
195
196ifeq ($(HOST_OS),freebsd)
197    QEMU_SYSTEM_LDLIBS += -L/usr/local/lib -lpthread -lX11 -lutil
198endif
199
200ifeq ($(HOST_OS),linux)
201  QEMU_SYSTEM_LDLIBS += -lutil -lrt
202endif
203
204ifeq ($(HOST_OS),windows)
205  # amd64-mingw32msvc- toolchain still name it ws2_32.  May change it once amd64-mingw32msvc-
206  # is stabilized
207  QEMU_SYSTEM_LDLIBS += -lwinmm -lws2_32 -liphlpapi
208else
209  QEMU_SYSTEM_LDLIBS += -lpthread
210endif
211
212ifeq ($(HOST_OS),darwin)
213  QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa,-framework,QTKit,-framework,CoreVideo
214
215  # SDK 10.6+ doesn't have __dyld_func_lookup anymore. Dynamic library lookup symbols
216  # are instead resolved at runtime
217  OSX_VERSION_MAJOR := $(shell echo $(mac_sdk_version) | cut -d . -f 2)
218  OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6 := $(shell [ $(OSX_VERSION_MAJOR) -ge 6 ] && echo true)
219  ifeq ($(OSX_VERSION_MAJOR_GREATER_THAN_OR_EQUAL_TO_6),true)
220    QEMU_SYSTEM_LDLIBS += -undefined dynamic_lookup
221  endif
222endif
223
224include $(LOCAL_PATH)/Makefile.common
225
226ifeq ($(HOST_OS),windows)
227  # on Windows, link the icon file as well into the executable
228  # unfortunately, our build system doesn't help us much, so we need
229  # to use some weird pathnames to make this work...
230
231  # Locate windres executable
232  WINDRES := windres
233  ifneq ($(USE_MINGW),)
234    # When building the Windows emulator under Linux, use the MinGW one
235    WINDRES := i586-mingw32msvc-windres
236  endif
237
238  # Usage: $(eval $(call insert-windows-icon))
239  define insert-windows-icon
240    LOCAL_PREBUILT_OBJ_FILES += images/emulator_icon.o
241  endef
242
243# This seems to be the only way to add an object file that was not generated from
244# a C/C++/Java source file to our build system. and very unfortunately,
245# $(TOPDIR)/$(LOCALPATH) will always be prepended to this value, which forces
246# us to put the object file in the source directory.
247$(LOCAL_PATH)/images/emulator_icon.o: $(LOCAL_PATH)/images/android_icon.rc
248	$(WINDRES) $< -I $(LOCAL_PATH)/images -o $@
249endif
250
251# We want to build all variants of the emulator binaries. This makes
252# it easier to catch target-specific regressions during emulator development.
253EMULATOR_TARGET_ARCH := arm
254include $(LOCAL_PATH)/Makefile.target
255
256EMULATOR_TARGET_ARCH := x86
257include $(LOCAL_PATH)/Makefile.target
258
259EMULATOR_TARGET_ARCH := mips
260include $(LOCAL_PATH)/Makefile.target
261
262##############################################################################
263##############################################################################
264###
265###  emulator: LAUNCHER FOR TARGET-SPECIFIC EMULATOR
266###
267###
268$(call start-emulator-program, emulator)
269
270LOCAL_SRC_FILES := android/main-emulator.c
271LOCAL_STATIC_LIBRARIES := emulator-common
272
273ifeq ($(HOST_OS),windows)
274$(eval $(call insert-windows-icon))
275endif
276
277$(call end-emulator-program)
278
279##############################################################################
280##############################################################################
281###
282###  emulator-ui: UI FRONT-END PROGRAM
283###
284###
285$(call start-emulator-program, emulator-ui)
286
287LOCAL_STATIC_LIBRARIES := \
288    emulator-common \
289    emulator-libui \
290    emulator-common \
291
292LOCAL_CFLAGS += -DCONFIG_STANDALONE_UI=1
293
294LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) $(EMULATOR_LIBUI_CFLAGS)
295LOCAL_LDLIBS += $(EMULATOR_COMMON_LDLIBS) $(EMULATOR_LIBUI_LDLIBS)
296
297LOCAL_SRC_FILES := \
298    android/cmdline-option.c \
299    android/config.c \
300    android/help.c \
301    android/looper-generic.c \
302    android/snapshot.c \
303    android/main-common.c \
304    android/main.c \
305    android/opengles.c \
306    android/utils/setenv.c \
307    vl-android-ui.c \
308    android/protocol/core-connection.c \
309    android/protocol/attach-ui-impl.c \
310    android/protocol/fb-updates-impl.c \
311    android/protocol/ui-commands-impl.c \
312    android/protocol/core-commands-proxy.c \
313    android/protocol/user-events-proxy.c \
314
315$(call gen-hw-config-defs,android/main-common.c)
316
317LOCAL_SRC_FILES += $(SDLMAIN_SOURCES)
318
319LOCAL_STATIC_LIBRARIES += $(SDL_STATIC_LIBRARIES)
320
321$(call end-emulator-program)
322
323## VOILA!!
324
325endif  # TARGET_ARCH == arm || TARGET_ARCH == x86 || TARGET_ARCH == mips
326endif  # BUILD_EMULATOR == true || BUILD_STANDALONE_EMULATOR == true
327