blob: 648d7f51d7a5d715e08d89eed4b5a1056f7a547c [file] [log] [blame]
# This file is included several times to build target-specific
# modules for the Android emulator. It will be called several times
# for arm, x86 and mips
#
ifndef EMULATOR_TARGET_ARCH
$(error EMULATOR_TARGET_ARCH is not defined!)
endif
EMULATOR_TARGET_CPU := $(EMULATOR_TARGET_ARCH)
ifeq ($(EMULATOR_TARGET_CPU),x86)
EMULATOR_TARGET_CPU := i386
endif
##############################################################################
##############################################################################
###
### emulator-target-$CPU: target-specific emulation code.
###
### Used by both the core and standalone programs.
###
# Common compiler flags for all target-dependent libraries
EMULATOR_TARGET_CFLAGS := \
-I$(LOCAL_PATH)/android/config/$(HOST_PREBUILT_TAG) \
-I$(LOCAL_PATH)/android/config/target-$(EMULATOR_TARGET_ARCH) \
-I$(LOCAL_PATH)/target-$(EMULATOR_TARGET_CPU) \
-I$(LOCAL_PATH)/fpu \
-DNEED_CPU_H
TCG_TARGET := $(HOST_ARCH)
ifeq ($(HOST_ARCH),x86)
TCG_TARGET := i386
endif
ifeq ($(HOST_ARCH),x86_64)
TCG_TARGET := i386
endif
EMULATOR_TARGET_CFLAGS += \
-I$(LOCAL_PATH)/tcg \
-I$(LOCAL_PATH)/tcg/$(TCG_TARGET) \
-DTARGET_ARCH=\"$(EMULATOR_TARGET_ARCH)\"
common_LOCAL_CFLAGS =
common_LOCAL_SRC_FILES =
common_LOCAL_CFLAGS += -I$(GLIB_INCLUDE_DIR)
# The following is to ensure that "config.h" will map to a target-specific
# configuration file header.
common_LOCAL_CFLAGS += $(EMULATOR_TARGET_CFLAGS)
common_LOCAL_SRC_FILES += \
tcg/tcg.c \
tcg-runtime.c \
util/host-utils.c \
##############################################################################
# Emulated hardware devices.
#
HW_SOURCES := \
bt/core.c \
bt/hci.c \
bt/hid.c \
bt/l2cap.c \
bt/sdp.c \
block/cdrom.c \
core/irq.c \
core/qdev.c \
core/sysbus.c \
core/dma.c \
android/goldfish/audio.c \
android/goldfish/device.c \
android/goldfish/events_device.c \
android/goldfish/fb.c \
android/goldfish/battery.c \
android/goldfish/mmc.c \
android/goldfish/memlog.c \
android/goldfish/nand.c \
android/goldfish/pipe.c \
android/goldfish/tty.c \
android/goldfish/vmem.c \
pci/pci.c \
scsi/scsi-disk.c \
usb/dev-hid.c \
usb/dev-hub.c \
usb/dev-storage.c \
usb/hcd-ohci.c \
usb/core.c \
watchdog/watchdog.c
ifeq ($(EMULATOR_TARGET_ARCH),arm)
HW_SOURCES += \
android/android_arm.c \
arm/pic.c \
arm/boot.c \
android/goldfish/interrupt.c \
android/goldfish/switch.c \
android/goldfish/timer.c \
android/goldfish/trace.c \
# The following sources must be compiled with the final executables
# because they contain device_init() or machine_init() statements.
HW_OBJ_SOURCES := hw/net/smc91c111.c
HW_OBJ_CFLAGS := $(EMULATOR_TARGET_CFLAGS)
common_LOCAL_SRC_FILES += disas/arm.c
# smc91c111.c requires <zlib.h>
common_LOCAL_CFLAGS += $(ZLIB_CFLAGS)
endif
# required to ensure we properly initialize virtual audio hardware
common_LOCAL_CFLAGS += -DHAS_AUDIO
ifeq ($(EMULATOR_TARGET_ARCH),x86)
HW_SOURCES += \
intc/apic.c \
intc/i8259.c \
timer/mc146818rtc.c \
pci-host/piix.c \
timer/i8254.c \
input/pckbd.c \
intc/ioapic.c \
input/ps2.c \
i386/smbios.c \
nvram/fw_cfg.c
# The following sources must be compiled with the final executables
# because they contain device_init() or machine_init() statements.
HW_OBJ_SOURCES := \
hw/net/ne2000.c \
hw/i386/pc.c
HW_OBJ_CFLAGS := $(EMULATOR_TARGET_CFLAGS)
endif
ifeq ($(EMULATOR_TARGET_ARCH),mips)
HW_SOURCES += \
android/android_mips.c \
mips/mips_pic.c \
android/goldfish/interrupt.c \
android/goldfish/switch.c \
android/goldfish/timer.c \
android/goldfish/trace.c \
mips/cputimer.c \
mips/mips_int.c
# The following sources must be compiled with the final executables
# because they contain device_init() or machine_init() statements.
HW_OBJ_SOURCES := hw/net/smc91c111.c
HW_OBJ_CFLAGS := $(EMULATOR_TARGET_CFLAGS)
common_LOCAL_SRC_FILES += disas/mips.c
# smc91c111.c requires <zlib.h>
LOCAL_CFLAGS += $(ZLIB_CFLAGS)
ifeq ($(ARCH_HAS_BIGENDIAN),true)
LOCAL_CFLAGS += -DTARGET_WORDS_BIGENDIAN
endif
endif
common_LOCAL_SRC_FILES += $(HW_SOURCES:%=hw/%)
common_LOCAL_SRC_FILES += \
backends/msmouse.c \
cpu-exec.c \
cputlb.c \
exec.c \
main-loop.c \
monitor-android.c \
translate-all.c \
android/varint.c \
softmmu_outside_jit.c
##############################################################################
# CPU-specific emulation.
#
common_LOCAL_CFLAGS += -fno-PIC -fomit-frame-pointer -Wno-sign-compare
ifeq ($(HOST_ARCH),ppc)
common_LOCAL_CFLAGS += -D__powerpc__
endif
ifeq ($(EMULATOR_TARGET_ARCH),arm)
common_LOCAL_SRC_FILES += \
target-arm/arm-semi.c \
target-arm/op_helper.c \
target-arm/iwmmxt_helper.c \
target-arm/neon_helper.c \
target-arm/helper.c \
target-arm/helper-android.c \
target-arm/translate.c \
target-arm/machine.c \
hw/arm/armv7m.c \
hw/arm/armv7m_nvic.c
endif # EMULATOR_TARGET_ARCH == arm
ifeq ($(EMULATOR_TARGET_ARCH), x86)
common_LOCAL_SRC_FILES += \
target-i386/op_helper.c \
target-i386/helper.c \
target-i386/translate.c \
target-i386/machine.c \
ifeq ($(HOST_OS),darwin)
common_LOCAL_SRC_FILES += \
target-i386/hax-all.c \
target-i386/hax-darwin.c
endif
ifeq ($(HOST_OS),windows)
common_LOCAL_SRC_FILES += \
target-i386/hax-all.c \
target-i386/hax-windows.c
endif
endif # EMULATOR_TARGET_ARCH == x86
ifeq ($(EMULATOR_TARGET_ARCH), mips)
common_LOCAL_SRC_FILES += \
target-mips/op_helper.c \
target-mips/helper.c \
target-mips/translate.c \
target-mips/machine.c
endif # EMULATOR_TARGET_ARCH == mips
common_LOCAL_SRC_FILES += fpu/softfloat.c
# compile KVM only if target is x86 on x86 Linux
QEMU_KVM_TAG := $(QEMU_HOST_TAG)-$(EMULATOR_TARGET_ARCH)
QEMU_DO_KVM := $(if $(filter linux-x86-x86 linux-x86_64-x86,$(QEMU_KVM_TAG)),true,false)
ifeq ($(QEMU_DO_KVM),true)
common_LOCAL_SRC_FILES += \
target-i386/kvm.c \
target-i386/kvm-gs-restore.c \
kvm-all.c \
kvm-android.c
endif
##############################################################################
# Memory-access checking support.
# Memory access checker uses information collected by instrumented code in
# libc.so in order to keep track of memory blocks allocated from heap. Memory
# checker then uses this information to make sure that every access to allocated
# memory is within allocated block. This information also allows detecting
# memory leaks and attempts to free/realloc invalid pointers.
#
common_LOCAL_CFLAGS += $(ELFF_CFLAGS)
MCHK_SOURCES := \
memcheck.c \
memcheck_proc_management.c \
memcheck_malloc_map.c \
memcheck_mmrange_map.c \
memcheck_util.c
common_LOCAL_SRC_FILES += $(MCHK_SOURCES:%=android/qemu/memcheck/%)
common_LOCAL_SRC_FILES += \
cpus.c \
arch_init.c
# What a mess, os-posix.c depends on the exact values of options
# which are target specific.
ifeq ($(HOST_OS),windows)
common_LOCAL_SRC_FILES += os-win32.c util/oslib-win32.c
else
common_LOCAL_SRC_FILES += os-posix.c util/oslib-posix.c
endif
## one for 32-bit
$(call start-emulator-library, emulator-target-$(EMULATOR_TARGET_CPU))
LOCAL_CFLAGS += $(common_LOCAL_CFLAGS)
LOCAL_SRC_FILES += $(common_LOCAL_SRC_FILES)
$(call gen-hw-config-defs)
$(call gen-hx-header,qemu-options.hx,qemu-options.def,os-posix.c os-win32.c)
$(call end-emulator-library)
ifdef EMULATOR_BUILD_64BITS
$(call start-emulator-library, emulator64-target-$(EMULATOR_TARGET_CPU))
LOCAL_CFLAGS += $(common_LOCAL_CFLAGS) -m64
LOCAL_SRC_FILES += $(common_LOCAL_SRC_FILES)
$(call gen-hw-config-defs)
$(call gen-hx-header,qemu-options.hx,qemu-options.def,os-posix.c os-win32.c)
$(call end-emulator-library)
endif # EMULATOR_BUILD_64BITS
##############################################################################
##############################################################################
###
### emulator-$ARCH: Standalone emulator program
###
###
common_LOCAL_LDLIBS =
common_LOCAL_CFLAGS =
common_LOCAL_SRC_FILES =
common_LOCAL_STATIC_LIBRARIES := \
emulator-libui \
emulator-libqemu \
emulator-target-$(EMULATOR_TARGET_CPU) \
emulator-libelff \
emulator-common
common_LOCAL_LDLIBS += \
$(EMULATOR_COMMON_LDLIBS) \
$(EMULATOR_LIBQEMU_LDLIBS) \
$(EMULATOR_LIBUI_LDLIBS) \
$(ELFF_LDLIBS)
common_LOCAL_CFLAGS += \
$(EMULATOR_TARGET_CFLAGS) \
$(EMULATOR_COMMON_CFLAGS) \
$(EMULATOR_LIBQEMU_CFLAGS) \
$(EMULATOR_LIBUI_CFLAGS)
common_LOCAL_SRC_FILES := \
audio/audio.c \
disas.c \
dma-helpers.c \
gdbstub.c \
qemu-timer.c \
log-rotate-android.c \
vl-android.c \
android/cmdline-option.c \
android/console.c \
android/display.c \
android/display-core.c \
android/help.c \
android/main-common.c \
android/main.c \
android/opengles.c \
android/protocol/core-commands-qemu.c \
android/protocol/ui-commands-qemu.c \
android/user-events-qemu.c \
hw/core/loader.c \
ui/keymaps.c \
util/qemu-timer-common.c \
util/iov.c \
# The following files cannot be in static libraries because they contain
# constructor functions that are otherwise stripped by the final linker
common_LOCAL_SRC_FILES += $(HW_OBJ_SOURCES)
common_LOCAL_CFLAGS += $(HW_OBJ_CFLAGS)
common_LOCAL_SRC_FILES += $(BLOCK_SOURCES)
common_LOCAL_CFLAGS += $(BLOCK_CFLAGS)
# Generate a completely static executable if needed.
# Note that this means no sound and graphics on Linux.
#
ifneq ($(strip $(CONFIG_STATIC_EXECUTABLE)$(BUILD_HOST_static)),)
common_LOCAL_SRC_FILES += android/dynlink-static.c
common_LOCAL_LDLIBS += -static
endif
## one for 32-bit
$(call start-emulator-program, emulator-$(EMULATOR_TARGET_ARCH))
LOCAL_STATIC_LIBRARIES += \
emulator-libui \
emulator-libqemu \
emulator-target-$(EMULATOR_TARGET_CPU) \
emulator-libjpeg \
emulator-libelff \
emulator-common \
$(SDL_STATIC_LIBRARIES)
LOCAL_LDLIBS += $(common_LOCAL_LDLIBS)
LOCAL_LDFLAGS += $(common_LOCAL_LDFLAGS)
LOCAL_CFLAGS += $(common_LOCAL_CFLAGS)
LOCAL_SRC_FILES += $(common_LOCAL_SRC_FILES)
$(call gen-hx-header,qemu-options.hx,qemu-options.def,vl-android.c qemu-options.h)
$(call gen-hw-config-defs)
ifeq ($(HOST_OS),windows)
$(eval $(call insert-windows-icon))
ifneq ($(BUILD_STANDALONE_EMULATOR),)
# Special exception for Windows: -lmingw32 must appear before libSDLmain
# on the link command-line, because it depends on _WinMain@16 which is
# exported by the latter.
LOCAL_LDFLAGS += -lmingw32
else
# The previous trick doesn't work with the platform build system because
# it places all linker flags _after_ the actually libraries, so instead
# recompiler SDLmain from source so its object file is listed in the link
# command, forcing the linker to use it.
LOCAL_SRC_FILES += $(SDLMAIN_SOURCES:%=$(SDL_DIR)/%)
endif
endif
$(call end-emulator-program)
ifdef EMULATOR_BUILD_64BITS
$(call start-emulator-program, emulator64-$(EMULATOR_TARGET_ARCH))
LOCAL_STATIC_LIBRARIES += \
emulator64-libui \
emulator64-libqemu \
emulator64-target-$(EMULATOR_TARGET_CPU) \
emulator64-libjpeg \
emulator64-libelff \
emulator64-common \
$(SDL_STATIC_LIBRARIES_64)
LOCAL_LDLIBS += $(common_LOCAL_LDLIBS) -m64
LOCAL_CFLAGS += $(common_LOCAL_CFLAGS) -m64
LOCAL_SRC_FILES += $(common_LOCAL_SRC_FILES)
$(call gen-hx-header,qemu-options.hx,qemu-options.def,vl-android.c qemu-options.h)
$(call gen-hw-config-defs)
$(call end-emulator-program)
endif # EMULATOR_BUILD_64BITS