diff options
-rw-r--r-- | Makefile | 12 | ||||
-rw-r--r-- | Makefile.android | 1271 | ||||
-rw-r--r-- | Makefile.common | 613 | ||||
-rw-r--r-- | Makefile.target | 353 | ||||
-rw-r--r-- | android/build/definitions.make | 8 | ||||
-rw-r--r-- | android/config/config.h | 18 | ||||
-rw-r--r-- | android/config/target-arm/config.h | 5 | ||||
-rw-r--r-- | android/config/target-x86/config.h | 3 |
8 files changed, 1072 insertions, 1211 deletions
@@ -13,6 +13,16 @@ # limitations under the License. # +# disable implicit rules +.SUFFIXES: +%:: %,v +%:: RCS/% +%:: RCS/%,v +%:: s.% +%:: SCCS/s.% +%.c: %.w %.ch + + # this is a set of definitions that allow the usage of Makefile.android # even if we're not using the Android build system. # @@ -24,7 +34,7 @@ CONFIG_MAKE := $(OBJS_DIR)/config.make CONFIG_H := $(OBJS_DIR)/config-host.h ifeq ($(wildcard $(CONFIG_MAKE)),) - $(error "The configuration file '$(CONFIG_MAKE)' doesnt' exist, please run the "rebuilt.sh" script) + $(error "The configuration file '$(CONFIG_MAKE)' doesnt' exist, please run the "android-configure.sh" script) endif include $(CONFIG_MAKE) diff --git a/Makefile.android b/Makefile.android index a6dd83a..095524a 100644 --- a/Makefile.android +++ b/Makefile.android @@ -17,7 +17,6 @@ endif # determine the location of platform-specific directories # CONFIG_DIRS := \ - $(LOCAL_PATH)/android/config \ $(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG) ifeq ($(BUILD_STANDALONE_EMULATOR),true) @@ -42,13 +41,6 @@ ifeq ($(BUILD_DEBUG_EMULATOR),true) -fno-PIC -falign-functions=0 endif -MY_CFLAGS += -DCONFIG_MEMCHECK - -# prepare config.h for x86 -ifeq ($(TARGET_ARCH),x86) -MY_CFLAGS += -DARCH_FLAGS_x86 -endif - MY_LDLIBS := # this is needed to build the emulator on 64-bit Linux systems @@ -96,6 +88,19 @@ endif # adequate values for HOST_CC # ifneq ($(BUILD_STANDALONE_EMULATOR),true) + # On Linux, use our custom 32-bit host toolchain, 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 := prebuilt/linux-x86/toolchain/i686-linux-glibc2.7-4.4.3/bin/i686-linux + # Don't do anything if the toolchain is not there + ifneq (,$(strip $(wildcard $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc))) + HOST_CC := $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc + HOST_CXX := $(HOST_SDK_TOOLCHAIN_PREFIX)-g++ + HOST_AR := $(HOST_SDK_TOOLCHAIN_PREFIX)-ar + MY_CC := $(HOST_CC) + endif # $(HOST_SDK_TOOLCHAIN_PREFIX)-gcc exists + endif # HOST_OS == linux ifneq ($(USE_CCACHE),) ccache := prebuilt/$(HOST_PREBUILT_TAG)/ccache/ccache @@ -119,751 +124,41 @@ endif # MY_CFLAGS += -Wall -Wno-missing-field-initializers -include $(CLEAR_VARS) - -########################################################### -# Zlib configuration -# -ZLIB_DIR := distrib/zlib-1.2.3 -include $(LOCAL_PATH)/$(ZLIB_DIR)/sources.make - -########################################################### -# Libpng configuration -# -LIBPNG_DIR := distrib/libpng-1.2.19 -include $(LOCAL_PATH)/$(LIBPNG_DIR)/sources.make - -############################################################################### -# build the TCG code generator -# -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-tcg - -TCG_TARGET := $(HOST_ARCH) -ifeq ($(TCG_TARGET),x86) - TCG_TARGET := i386 -endif - -TCG_CFLAGS := -I$(LOCAL_PATH)/tcg -I$(LOCAL_PATH)/tcg/$(TCG_TARGET) - -LOCAL_CFLAGS += $(TCG_CFLAGS) -DNEED_CPU_H \ - -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) \ - -I$(LOCAL_PATH)/fpu \ - -LOCAL_SRC_FILES := \ - tcg/tcg.c \ - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# build the HW emulation support -# -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-hw - -HW_CFLAGS := -I$(LOCAL_PATH)/hw - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) -DNEED_CPU_H -LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) -I$(LOCAL_PATH)/fpu $(HW_CFLAGS) -LOCAL_CFLAGS += $(ZLIB_CFLAGS) -I$(LOCAL_PATH)/$(ZLIB_DIR) - -HW_SOURCES := \ - bt.c \ - bt-hci.c \ - bt-hid.c \ - bt-l2cap.c \ - bt-sdp.c \ - cdrom.c \ - dma.c \ - irq.c \ - goldfish_device.c \ - goldfish_events_device.c \ - goldfish_fb.c \ - goldfish_battery.c \ - goldfish_mmc.c \ - goldfish_memlog.c \ - goldfish_nand.c \ - goldfish_tty.c \ - msmouse.c \ - pci.c \ - qdev.c \ - scsi-disk.c \ - sysbus.c \ - usb-hid.c \ - usb-hub.c \ - usb-msd.c \ - usb-ohci.c \ - usb.c \ - watchdog.c \ - -ifeq ($(TARGET_ARCH),arm) -HW_SOURCES += android_arm.c \ - arm_pic.c \ - smc91c111.c \ - goldfish_audio.c \ - goldfish_interrupt.c \ - goldfish_switch.c \ - goldfish_timer.c \ - goldfish_trace.c \ - -endif - -ifeq ($(TARGET_ARCH),x86) -HW_SOURCES += pc.c \ - apic.c \ - i8259.c \ - mc146818rtc.c \ - piix_pci.c \ - i8254.c \ - ne2000.c \ - pckbd.c \ - ioapic.c \ - ps2.c \ - smbios.c \ - fw_cfg.c \ - -endif - -LOCAL_SRC_FILES += $(HW_SOURCES:%=hw/%) - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# build the ELF/DWARF stuff -# This library is used by emulator's memory checker to extract debug information -# from the symbol files when reporting memory allocation violations. In -# particular, this library is used to extract routine name and source file -# location for the code address where violation has been detected. -# -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-elff -LOCAL_CPP_EXTENSION := .cc - -ELFF_CFLAGS := -I$(LOCAL_PATH)/elff - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) -fno-exceptions -LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) -I$(LOCAL_PATH)/fpu $(ELFF_CFLAGS) -LOCAL_CFLAGS += $(ZLIB_CFLAGS) -I$(LOCAL_PATH)/$(ZLIB_DIR) - -ELFF_SOURCES := \ - dwarf_cu.cc \ - dwarf_die.cc \ - dwarf_utils.cc \ - elf_alloc.cc \ - elf_file.cc \ - elf_mapped_section.cc \ - elff_api.cc \ - -LOCAL_SRC_FILES += $(ELFF_SOURCES:%=elff/%) -ELFF_LDLIBS := -lstdc++ - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# build the 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. -# -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-memcheck - -MCHK_CFLAGS := -I$(LOCAL_PATH)/memcheck -I$(LOCAL_PATH)/elff - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) -DNEED_CPU_H -LOCAL_CFLAGS += -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) -I$(LOCAL_PATH)/fpu $(MCHK_CFLAGS) -LOCAL_CFLAGS += $(ZLIB_CFLAGS) -I$(LOCAL_PATH)/$(ZLIB_DIR) - -MCHK_SOURCES := \ - memcheck.c \ - memcheck_proc_management.c \ - memcheck_malloc_map.c \ - memcheck_mmrange_map.c \ - memcheck_util.c \ - -LOCAL_SRC_FILES += $(MCHK_SOURCES:%=memcheck/%) - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# build the CPU-specific emulation engine sources -# -include $(CLEAR_VARS) - -ifeq ($(TARGET_ARCH),arm) -LOCAL_MODULE := emulator-arm -endif -ifeq ($(TARGET_ARCH),x86) -LOCAL_MODULE := emulator-i386 -LOCAL_MODULE_TAGS := optional -endif - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_MODULE := $(LOCAL_MODULE) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) -LOCAL_STATIC_LIBRARIES := emulator-hw - -LOCAL_CFLAGS := -fno-PIC -fomit-frame-pointer -Wno-sign-compare -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) - -LOCAL_CFLAGS += -I$(LOCAL_PATH) \ - -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) \ - -I$(LOCAL_PATH)/fpu \ - $(TCG_CFLAGS) \ - $(HW_CFLAGS) \ - -DNEED_CPU_H \ - -ifeq ($(HOST_ARCH),ppc) - LOCAL_CFLAGS += -D__powerpc__ -endif - -ifeq ($(TARGET_ARCH),arm) -LOCAL_SRC_FILES += exec.c cpu-exec.c \ - $(EMULATOR_TARGET_CPU)/op_helper.c \ - $(EMULATOR_TARGET_CPU)/iwmmxt_helper.c \ - $(EMULATOR_TARGET_CPU)/neon_helper.c \ - $(EMULATOR_TARGET_CPU)/helper.c \ - $(EMULATOR_TARGET_CPU)/translate.c \ - $(EMULATOR_TARGET_CPU)/machine.c \ - translate-all.c \ - hw/armv7m.c \ - hw/armv7m_nvic.c \ - arm-semi.c \ - trace.c \ - varint.c \ - dcache.c \ - softmmu_outside_jit.c \ - -LOCAL_SRC_FILES += fpu/softfloat.c -endif - -ifeq ($(TARGET_ARCH), x86) -LOCAL_SRC_FILES += exec.c cpu-exec.c \ - $(EMULATOR_TARGET_CPU)/op_helper.c \ - $(EMULATOR_TARGET_CPU)/helper.c \ - $(EMULATOR_TARGET_CPU)/translate.c \ - $(EMULATOR_TARGET_CPU)/machine.c \ - translate-all.c \ - trace.c \ - varint.c \ - dcache.c \ - softmmu_outside_jit.c \ - -LOCAL_SRC_FILES += fpu/softfloat-native.c -endif - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# SDL-related definitions -# - -# Build SDL from sources except on linux-x86, to avoid installing all -# the X11 development packages on our build servers. -# -BUILD_SDL_FROM_SOURCES := true -ifeq ($(QEMU_HOST_TAG),linux-x86) - BUILD_SDL_FROM_SOURCES := false -endif -ifeq ($(QEMU_HOST_TAG),darwin-x86) - BUILD_SDL_FROM_SOURCES := false -endif -ifeq ($(BUILD_STANDALONE_EMULATOR),true) - BUILD_SDL_FROM_SOURCES := true -endif - -ifneq ($(SDL_CONFIG),) - BUILD_SDL_FROM_SOURCES := false -endif - -ifneq ($(BUILD_SDL_FROM_SOURCES),true) - -SDL_CONFIG ?= prebuilt/$(QEMU_HOST_TAG)/sdl/bin/sdl-config -SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags) - -# We need to filter out the _GNU_SOURCE variable because it breaks recent -# releases of Cygwin when using the -mno-cygwin option. Moreover, we don't -# need this macro at all to build the Android emulator. -SDL_CFLAGS := $(filter-out -D_GNU_SOURCE=1,$(SDL_CFLAGS)) -SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(SDL_CONFIG) --static-libs)) - -# Circular dependencies between libSDL and libSDLmain; -# We repeat the libraries in the final link to work around it. -SDL_STATIC_LIBRARIES := libSDL libSDLmain libSDL libSDLmain - -else # !BUILD_STANDALONE_EMULATOR - -SDL_DIR := distrib/sdl-1.2.12 -include $(LOCAL_PATH)/$(SDL_DIR)/sources.make - -endif # !BUILD_STANDALONE_EMULATOR - -############################################################################## -# determine audio sources, build the prebuilt audio-library if needed -# - -# determine AUDIO sources based on current configuration -# -AUDIO_SOURCES := audio.c noaudio.c wavaudio.c wavcapture.c mixeng.c -AUDIO_CFLAGS := -I$(LOCAL_PATH)/audio -DHAS_AUDIO -AUDIO_LDLIBS := - -ifeq ($(HOST_OS),darwin) - CONFIG_COREAUDIO ?= yes - AUDIO_CFLAGS += -DHOST_BSD=1 -endif - -ifeq ($(HOST_OS),windows) - CONFIG_WINAUDIO ?= yes -endif - -ifeq ($(HOST_OS),linux) - CONFIG_OSS ?= yes - CONFIG_ALSA ?= yes - CONFIG_PULSEAUDIO ?= yes - CONFIG_ESD ?= yes -endif - -ifeq ($(HOST_OS),freebsd) - CONFIG_OSS ?= yes -endif - -ifeq ($(CONFIG_COREAUDIO),yes) - AUDIO_SOURCES += coreaudio.c - AUDIO_CFLAGS += -DCONFIG_COREAUDIO - AUDIO_LDLIBS += -Wl,-framework,CoreAudio -endif +# Needed to build fpu/softfloat-native.h properly +MY_CFLAGS += -D_GNU_SOURCE=1 -ifeq ($(CONFIG_WINAUDIO),yes) - AUDIO_SOURCES += winaudio.c - AUDIO_CFLAGS += -DCONFIG_WINAUDIO -endif - -ifeq ($(CONFIG_PULSEAUDIO),yes) - AUDIO_SOURCES += paaudio.c audio_pt_int.c - AUDIO_CFLAGS += -DCONFIG_PULSEAUDIO -endif - -ifeq ($(CONFIG_ALSA),yes) - AUDIO_SOURCES += alsaaudio.c audio_pt_int.c - AUDIO_CFLAGS += -DCONFIG_ALSA -endif - -ifeq ($(CONFIG_ESD),yes) - AUDIO_SOURCES += esdaudio.c - AUDIO_CFLAGS += -DCONFIG_ESD -endif - -ifeq ($(CONFIG_OSS),yes) - AUDIO_SOURCES += ossaudio.c - AUDIO_CFLAGS += -DCONFIG_OSS -endif - -AUDIO_SOURCES := $(call sort,$(AUDIO_SOURCES:%=audio/%)) - -# determine whether we're going to use the prebuilt -# audio library (this is useful on Linux to avoid requiring -# all sound-related development packages to be installed on -# the build and developer machines). +# A useful function that can be used to start the declaration of a host +# module. Avoids repeating the same stuff again and again. +# Usage: # -# note that you can define BUILD_QEMU_AUDIO_LIB to true -# in your environment to force recompilation. +# $(call start-emulator-library, <module-name>) # -QEMU_AUDIO_LIB := - -ifneq ($(BUILD_STANDALONE_EMULATOR),true) - QEMU_AUDIO_LIB := $(wildcard \ - prebuilt/$(QEMU_HOST_TAG)/emulator/libqemu-audio.a) -endif - -ifeq ($(BUILD_QEMU_AUDIO_LIB),true) - include $(CLEAR_VARS) - LOCAL_NO_DEFAULT_COMPILER_FLAGS := true - LOCAL_CC := $(MY_CC) - LOCAL_MODULE := libqemu-audio - LOCAL_LDLIBS := $(MY_LDLIBS) - - LOCAL_CFLAGS := -Wno-sign-compare \ - -fno-strict-aliasing -W -Wall -Wno-unused-parameter \ - -I$(LOCAL_PATH) \ - -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) \ - -I$(LOCAL_PATH)/fpu \ - - # this is very important, otherwise the generated binaries may - # not link properly on our build servers - ifeq ($(HOST_OS),linux) - LOCAL_CFLAGS += -fno-stack-protector - endif - - LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(AUDIO_CFLAGS) - - LOCAL_CFLAGS += $(SDL_CFLAGS) - - LOCAL_SRC_FILES += $(AUDIO_SOURCES) - - include $(BUILD_HOST_STATIC_LIBRARY) - QEMU_AUDIO_LIB := $(LOCAL_BUILT_MODULE) - -endif # !QEMU_AUDIO_LIB - -############################################################################## -# Common CFLAGS for UI and Core builds - -# add the build ID to the default macro definitions -UI_AND_CORE_CFLAGS := -DANDROID_BUILD_ID="$(strip $(BUILD_ID))-$(strip $(BUILD_NUMBER))" - -# For non-standalone builds, extract the major version number from the Android SDK -# tools revision number. -ifneq ($(BUILD_STANDALONE_EMULATOR),true) - ANDROID_SDK_TOOLS_REVISION := $(shell awk -F= '/Pkg.Revision/ { print $$2; }' sdk/files/tools_source.properties) -endif - -ANDROID_SDK_TOOLS_REVISION := $(strip $(ANDROID_SDK_TOOLS_REVISION)) -ifdef ANDROID_SDK_TOOLS_REVISION - UI_AND_CORE_CFLAGS += -DANDROID_SDK_TOOLS_REVISION=$(ANDROID_SDK_TOOLS_REVISION) -endif - -UI_AND_CORE_CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE - - -############################################################################## -# Build emulator core library. -# This library contains "pure" emulation code separated from the intricacies -# of the UI. +# ... declarations # -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-core - -# don't remove the -fno-strict-aliasing, or you'll break things -# (e.g. slirp-android/network support) -# -EMULATOR_CORE_CFLAGS := -fno-PIC -Wno-sign-compare \ - -fno-strict-aliasing -g -W -Wall -Wno-unused-parameter - -# Needed by the upstream code -EMULATOR_CORE_CFLAGS += -DNEED_CPU_H - -# Common includes for the emulator -EMULATOR_CORE_CFLAGS += -I$(LOCAL_PATH)/ \ - -I$(LOCAL_PATH)/$(EMULATOR_TARGET_CPU) \ - -I$(LOCAL_PATH)/fpu \ - $(TCG_CFLAGS) \ - $(HW_CFLAGS) \ - -# Required by block.c, default value is empty in upstream -EMULATOR_CORE_CFLAGS += -DCONFIG_BDRV_WHITELIST="" - -# Required -EMULATOR_CORE_CFLAGS += -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1 -# include slirp-android code, i.e. the user-level networking stuff -# -SLIRP_SOURCES := bootp.c cksum.c debug.c if.c ip_icmp.c ip_input.c ip_output.c \ - mbuf.c misc.c sbuf.c slirp.c socket.c tcp_input.c tcp_output.c \ - tcp_subr.c tcp_timer.c tftp.c udp.c - -LOCAL_SRC_FILES += $(SLIRP_SOURCES:%=slirp-android/%) -EMULATOR_CORE_CFLAGS += -I$(LOCAL_PATH)/slirp-android - -# socket proxy support -# -PROXY_SOURCES := \ - proxy_common.c \ - proxy_http.c \ - proxy_http_connector.c \ - proxy_http_rewriter.c \ - -LOCAL_SRC_FILES += $(PROXY_SOURCES:%=proxy/%) -EMULATOR_CORE_CFLAGS += -I$(LOCAL_PATH)/proxy - -# include telephony stuff -# -TELEPHONY_SOURCES := android_modem.c modem_driver.c gsm.c sim_card.c sysdeps_qemu.c sms.c remote_call.c -LOCAL_SRC_FILES += $(TELEPHONY_SOURCES:%=telephony/%) -EMULATOR_CORE_CFLAGS += -I$(LOCAL_PATH)/telephony - -# include android related stuff -# -ANDROID_SOURCES := qemu-setup.c -LOCAL_SRC_FILES += $(ANDROID_SOURCES:%=android/%) - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(EMULATOR_CORE_CFLAGS) -LOCAL_CFLAGS += $(UI_AND_CORE_CFLAGS) - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# Build emulator UI library. -# This library contains some emulator related UI components. -# -include $(CLEAR_VARS) - -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_LDLIBS := $(MY_LDLIBS) -LOCAL_MODULE := emulator-uilib - -EMULATOR_UI_CFLAGS := - -# include the SDL sources +# $(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_CFLAGS := $(MY_CFLAGS)) \ + $(eval LOCAL_LDLIBS := $(MY_LDLIBS)) \ + $(eval LOCAL_MODULE_TAGS := debug) \ + $(eval LOCAL_MODULE := $1) -# IMPORTANT: Normally, we should add SDLMAIN_SOURCES here, however this breaks -# the Linux mingw32 build. Apparently, the i586-mingw32-ld wants the -# implementation of _WinMain@16 to be in an object file on the final -# link command used to generate the executable, and will not search -# in the static libraries that are used to build it. -# -LOCAL_SRC_FILES += $(SDL_SOURCES) #$(SDLMAIN_SOURCES) -EMULATOR_UI_CFLAGS += $(SDL_CFLAGS) -I$(LOCAL_PATH)/$(SDL_DIR)/include - -# the skin support sources -# -SKIN_SOURCES := rect.c \ - region.c \ - image.c \ - trackball.c \ - keyboard.c \ - keyset.c \ - file.c \ - window.c \ - scaler.c \ - composer.c \ - surface.c \ - -LOCAL_SRC_FILES += $(SKIN_SOURCES:%=android/skin/%) -EMULATOR_UI_CFLAGS += -I$(LOCAL_PATH)/skin - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(EMULATOR_CORE_CFLAGS) $(EMULATOR_UI_CFLAGS) - -LOCAL_MODULE_TAGS := debug - -include $(BUILD_HOST_STATIC_LIBRARY) - -############################################################################## -# lists of source files used to build the emulator core -# - -# block sources -# -CORE_BLOCK_SOURCES = block.c \ - blockdev.c \ - block/qcow.c \ - block/qcow2.c \ - block/qcow2-refcount.c \ - block/qcow2-snapshot.c \ - block/qcow2-cluster.c \ - block/cloop.c \ - block/dmg.c \ - block/vvfat.c \ - block/raw.c -ifeq ($(HOST_OS),windows) - CORE_BLOCK_SOURCES += block/raw-win32.c -else - CORE_BLOCK_SOURCES += block/raw-posix.c -endif +# Used with start-emulator-library +end-emulator-library = \ + $(eval include $(BUILD_HOST_STATIC_LIBRARY)) -# hw sources -# -ifeq ($(TARGET_ARCH),arm) -CORE_HW_SOURCES = hw/arm_boot.c \ - hw/android_arm.c -endif +# 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) -ifeq ($(TARGET_ARCH),x86) -CORE_HW_SOURCES = hw/pc.c -endif +# A varient of end-emulator-library for host programs instead +end-emulator-program = \ + $(eval LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS)) \ + $(eval include $(BUILD_HOST_EXECUTABLE)) -# migration sources -# -CORE_MIGRATION_SOURCES = iolooper-select.c -ifeq ($(HOST_OS),windows) - CORE_MIGRATION_SOURCES += migration-dummy-android.c -else - CORE_MIGRATION_SOURCES += migration.c \ - migration-exec.c \ - migration-tcp-android.c -endif - -# misc. sources -# -CORE_MISC_SOURCES = vl-android.c \ - async.c \ - console.c \ - qemu-malloc.c \ - cutils.c \ - osdep.c \ - loader.c \ - monitor.c \ - readline.c \ - qemu-char-android.c \ - outputchannel.c \ - qemu-error.c \ - qerror.c \ - disas.c \ - aes.c \ - d3des.c \ - vnc-android.c \ - acl.c \ - keymaps.c \ - buffered_file.c \ - cbuffer.c \ - gdbstub.c \ - input.c \ - ioport.c \ - notify.c \ - path.c \ - shaper.c \ - charpipe.c \ - tcpdump.c \ - qemu-option.c \ - savevm.c \ - net-android.c \ - aio-android.c \ - dma-helpers.c \ - qemu-config.c \ - qemu-sockets-android.c \ - bt-host.c \ - bt-vhci.c \ - module.c \ - qemu-timer.c \ - android/boot-properties.c \ - android/hw-kmsg.c \ - android/hw-lcd.c \ - android/gps.c \ - android/hw-events.c \ - android/hw-control.c \ - android/console.c \ - android/hw-sensors.c \ - android/hw-qemud.c \ - android/core-init-utils.c \ - android/config.c \ - android/snapshot.c \ - android/utils/timezone.c \ - -ifeq ($(TARGET_ARCH),arm) - CORE_MISC_SOURCES += arm-dis.c -endif - -ifeq ($(HOST_ARCH),x86) - CORE_MISC_SOURCES += i386-dis.c -endif -ifeq ($(HOST_ARCH),x86_64) - CORE_MISC_SOURCES += i386-dis.c -endif -ifeq ($(HOST_ARCH),ppc) - CORE_MISC_SOURCES += ppc-dis.c \ - cache-utils.c -endif - -ifeq ($(HOST_OS),linux) - CORE_MISC_SOURCES += usb-linux.c \ - qemu-thread.c -else - CORE_MISC_SOURCES += usb-dummy-android.c -endif - -ifeq ($(HOST_OS),windows) - CORE_MISC_SOURCES += tap-win32.c -else - CORE_MISC_SOURCES += posix-aio-compat.c -endif - -# sources inherited from upstream, but not fully -# integrated into android emulator -# -CORE_UPSTREAM_SOURCES = json-lexer.c \ - json-parser.c \ - json-streamer.c \ - qjson.c \ - qbool.c \ - qdict.c \ - qfloat.c \ - qint.c \ - qlist.c \ - qstring.c \ - - -CORE_SOURCES = $(CORE_BLOCK_SOURCES) $(CORE_HW_SOURCES) -CORE_SOURCES += $(CORE_MIGRATION_SOURCES) $(CORE_MISC_SOURCES) -CORE_SOURCES += $(CORE_UPSTREAM_SOURCES) - -CORE_SOURCES += android/audio-test.c - -############################################################################## -# lists of source files used to build the emulator UI -# - -UI_SOURCES = loadpng.c \ - android/user-config.c \ - android/resource.c \ - android/qemulator.c \ - android/keycode.c \ - android/help.c \ - android/avd/info.c \ - -############################################################################## -# lists of source files used by both, emulator UI and emulator core -# - -UI_AND_CORE_SOURCES = \ - sockets.c \ - android/keycode-array.c \ - android/charmap.c \ - android/async-utils.c \ - android/sync-utils.c \ - android/async-console.c \ - android/utils/assert.c \ - android/utils/bufprint.c \ - android/utils/debug.c \ - android/utils/path.c \ - android/utils/dirscanner.c \ - android/utils/filelock.c \ - android/utils/mapfile.c \ - android/utils/misc.c \ - android/utils/panic.c \ - android/utils/reflist.c \ - android/utils/refset.c \ - android/utils/stralloc.c \ - android/utils/system.c \ - android/utils/tempfile.c \ - android/utils/vector.c \ - android/avd/hw-config.c \ - android/utils/ini.c \ - -# include the Zlib sources -# -UI_AND_CORE_SOURCES += $(ZLIB_SOURCES) -UI_AND_CORE_CFLAGS += $(ZLIB_CFLAGS) -I$(LOCAL_PATH)/$(ZLIB_DIR) - -# include the Libpng sources -# -UI_AND_CORE_SOURCES += $(LIBPNG_SOURCES) -UI_AND_CORE_CFLAGS += $(LIBPNG_CFLAGS) -I$(LOCAL_PATH)/$(LIBPNG_DIR) # The common libraries # @@ -890,471 +185,57 @@ ifeq ($(HOST_OS),darwin) QEMU_SYSTEM_LDLIBS += -Wl,-framework,Cocoa endif +include $(LOCAL_PATH)/Makefile.common -############################################################################## -# now build the emulator itself -# -include $(CLEAR_VARS) - -LOCAL_GENERATED_SOURCES := -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_MODULE := emulator -ifeq ($(TARGET_ARCH),arm) -LOCAL_STATIC_LIBRARIES := emulator-memcheck emulator-hw emulator-arm emulator-tcg -endif -ifeq ($(TARGET_ARCH),x86) -LOCAL_STATIC_LIBRARIES := emulator-memcheck emulator-hw emulator-i386 emulator-tcg -endif -LOCAL_STATIC_LIBRARIES += emulator-elff -LOCAL_STATIC_LIBRARIES += emulator-core emulator-uilib -LOCAL_LDLIBS := $(MY_LDLIBS) - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(EMULATOR_CORE_CFLAGS) $(EMULATOR_UI_CFLAGS) - -# add the build ID to the default macro definitions -LOCAL_CFLAGS += $(UI_AND_CORE_CFLAGS) - -# include sound support source files. we first try to see if we have a prebuilt audio -# library. if not, we build things the "hard" way. -# -# note that to generate the prebuilt audio library, you should do the following: -# -# cd tools/qemu -# ./android-rebuild.sh -# distrib/update-audio.sh -# -ifeq ($(QEMU_AUDIO_LIB),) - LOCAL_SRC_FILES += $(AUDIO_SOURCES) -endif # !QEMU_AUDIO_LIB +# 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 -LOCAL_CFLAGS += $(AUDIO_CFLAGS) -LOCAL_LDLIBS += $(AUDIO_LDLIBS) - -# the linux-user sources, I doubt we really need these -# -#LINUX_SOURCES := main.c elfload.c mmap.c signal.c path.c syscall.c -#LOCAL_SRC_FILES += $(LINUX_SOURCES:%=linux-user/%) - -ifeq ($(HOST_ARCH),x86) -# enable MMX code for our skin scaler -LOCAL_CFLAGS += -DUSE_MMX=1 -mmmx -DNEED_CPU_H -endif - -# include other sources -# -VL_SOURCES := android/framebuffer.c \ - user-events-qemu.c \ - android/cmdline-option.c \ - android/display.c \ - android/looper-qemu.c \ - android/protocol/ui-commands-qemu.c \ - android/protocol/core-commands-qemu.c \ - android/main-common.c \ - android/main.c \ - -# Add common system libraries -# -LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS) - -LOCAL_SRC_FILES += $(VL_SOURCES) $(CORE_SOURCES) $(UI_SOURCES) $(UI_AND_CORE_SOURCES) - -# add SDL-specific flags -# -LOCAL_CFLAGS += $(SDL_CFLAGS) -LOCAL_LDLIBS += $(SDL_LDLIBS) -LOCAL_STATIC_LIBRARIES += $(SDL_STATIC_LIBRARIES) - -# add ELFF-specific flags -# -LOCAL_LDLIBS += $(ELFF_LDLIBS) - -# 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... -# -ifeq ($(HOST_OS),windows) - -# Locate windres executable -WINDRES := windres -ifneq ($(USE_MINGW),) - # When building the Windows emulator under Linux, use the MinGW one - WINDRES := i586-mingw32msvc-windres -endif - -INTERMEDIATE := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) -ANDROID_ICON_OBJ := android_icon.o -ANDROID_ICON_PATH := $(LOCAL_PATH)/images -$(ANDROID_ICON_PATH)/$(ANDROID_ICON_OBJ): $(ANDROID_ICON_PATH)/android_icon.rc - $(WINDRES) $< -I $(ANDROID_ICON_PATH) -o $@ - -# 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_PREBUILT_OBJ_FILES += images/$(ANDROID_ICON_OBJ) -endif - -# qemu-options.h is generated from qemu-options.hx with the "hxtool" shell script -# -intermediates := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) - -QEMU_OPTIONS_H := $(intermediates)/qemu-options.h -$(QEMU_OPTIONS_H): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_OPTIONS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/hxtool -h < $< > $@ -$(QEMU_OPTIONS_H): $(LOCAL_PATH)/qemu-options.hx $(LOCAL_PATH)/hxtool - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_OPTIONS_H) - -LOCAL_GENERATED_SOURCES += $(QEMU_OPTIONS_H) - -# qemu-monitor.h is generated from qemu-monitor.hx with the "hxtool" shell script -# -intermediates := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) - -QEMU_MONITOR_H := $(intermediates)/qemu-monitor.h -$(QEMU_MONITOR_H): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_MONITOR_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/hxtool -h < $< > $@ -$(QEMU_MONITOR_H): $(LOCAL_PATH)/qemu-monitor.hx $(LOCAL_PATH)/hxtool - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_MONITOR_H) - -LOCAL_GENERATED_SOURCES += $(QEMU_MONITOR_H) - - -# gdbstub-xml.c contains C-compilable arrays corresponding to the content -# of $(LOCAL_PATH)/gdb-xml/, and is generated with the 'feature_to_c.sh' script. -# -ifeq ($(QEMU_TARGET_XML_SOURCES),) - QEMU_TARGET_XML_SOURCES := arm-core arm-neon arm-vfp arm-vfp3 - QEMU_TARGET_XML_SOURCES := $(QEMU_TARGET_XML_SOURCES:%=$(LOCAL_PATH)/gdb-xml/%.xml) -endif - -QEMU_GDBSTUB_XML_C := $(intermediates)/gdbstub-xml.c -$(QEMU_GDBSTUB_XML_C): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_GDBSTUB_XML_C): PRIVATE_SOURCES := $(TARGET_XML_SOURCES) -$(QEMU_GDBSTUB_XML_C): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/feature_to_c.sh $@ $(QEMU_TARGET_XML_SOURCES) -$(QEMU_GDBSTUB_XML_C): $(QEMU_TARGET_XML_SOURCES) $(LOCAL_PATH)/feature_to_c.sh - $(hide) rm -f $@ - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_GDBSTUB_XML_C) - -LOCAL_GENERATED_SOURCES += $(QEMU_GDBSTUB_XML_C) - -# hw-config-defs.h is generated from android/avd/hardware-properties.ini -# -QEMU_HARDWARE_PROPERTIES_INI := $(LOCAL_PATH)/android/avd/hardware-properties.ini -QEMU_HW_CONFIG_DEFS_H := $(LOCAL_PATH)/android/avd/hw-config-defs.h -$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_SOURCES := $(QEMU_HARDWARE_PROPERTIES_INI) -$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/android/tools/gen-hw-config.py $(QEMU_HARDWARE_PROPERTIES_INI) $@ -$(QEMU_HW_CONFIG_DEFS_H): $(QEMU_HARDWARE_PROPERTIES_INI) $(LOCAL_PATH)/android/tools/gen-hw-config.py - $(hide) rm -f $@ - $(transform-generated-source) - -$(LOCAL_PATH)/android/avd/hw-config.h: $(QEMU_HW_CONFIG_DEFS_H) - -LOCAL_GENERATED_SOURCES += $(QEMU_HW_CONFIG_DEFS_H) - -# this is already done by the Android build system, but is done for the -# benefit of the stand-alone one. -# -ifeq ($(BUILD_STANDALONE_EMULATOR),true) - LOCAL_CFLAGS += -I$(intermediates) -endif - -LOCAL_LDLIBS += $(QEMU_AUDIO_LIB) - -# Generate a completely static executable if needed. -# Note that this means no sound and graphics on Linux. -# -ifeq ($(CONFIG_STATIC_EXECUTABLE),true) - LOCAL_SRC_FILES += dynlink-static.c - LOCAL_LDLIBS += -static -endif - -LOCAL_MODULE := emulator - -# See comment about SDLMAIN_SOURCES in the 'emulator-uilib' module declarations. -LOCAL_SRC_FILES += $(SDLMAIN_SOURCES) - -include $(BUILD_HOST_EXECUTABLE) +EMULATOR_TARGET_ARCH := x86 +include $(LOCAL_PATH)/Makefile.target ############################################################################## -# Build standalone emulator core. -# -include $(CLEAR_VARS) - -LOCAL_GENERATED_SOURCES := -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_MODULE := qemu-android-$(TARGET_ARCH) -ifeq ($(TARGET_ARCH),arm) -LOCAL_STATIC_LIBRARIES := emulator-memcheck emulator-hw emulator-arm emulator-tcg -endif -ifeq ($(TARGET_ARCH),x86) -LOCAL_STATIC_LIBRARIES := emulator-memcheck emulator-hw emulator-i386 emulator-tcg -endif - -LOCAL_STATIC_LIBRARIES += emulator-elff -LOCAL_STATIC_LIBRARIES += emulator-core -LOCAL_LDLIBS := $(MY_LDLIBS) - -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(EMULATOR_CORE_CFLAGS) -LOCAL_CFLAGS += $(UI_AND_CORE_CFLAGS) -DCONFIG_STANDALONE_CORE - -# include sound support source files. we first try to see if we have a prebuilt audio -# library. if not, we build things the "hard" way. -# -# note that to generate the prebuilt audio library, you should do the following: -# -# cd tools/qemu -# ./android-rebuild.sh -# distrib/update-audio.sh -# -ifeq ($(QEMU_AUDIO_LIB),) - LOCAL_SRC_FILES += $(AUDIO_SOURCES) -endif # !QEMU_AUDIO_LIB - -LOCAL_CFLAGS += $(AUDIO_CFLAGS) -LOCAL_LDLIBS += $(AUDIO_LDLIBS) - -# the linux-user sources, I doubt we really need these -# -#LINUX_SOURCES := main.c elfload.c mmap.c signal.c path.c syscall.c -#LOCAL_SRC_FILES += $(LINUX_SOURCES:%=linux-user/%) - -# include other sources -# -VL_SOURCES := android/framebuffer.c \ - user-events-qemu.c \ - android/looper-qemu.c \ - android/looper-generic.c \ - android/display-core.c \ - android/protocol/attach-ui-proxy.c \ - android/protocol/fb-updates-proxy.c \ - android/protocol/user-events-impl.c \ - android/protocol/ui-commands-proxy.c \ - android/protocol/core-commands-impl.c \ - -# Add common system libraries -# -LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS) - -LOCAL_SRC_FILES += $(VL_SOURCES) $(CORE_SOURCES) $(UI_AND_CORE_SOURCES) - -# add ELFF-specific flags -# -LOCAL_LDLIBS += $(ELFF_LDLIBS) - -# 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... -# -ifeq ($(HOST_OS),windows) - -# Locate windres executable -WINDRES := windres -ifneq ($(USE_MINGW),) - # When building the Windows emulator under Linux, use the MinGW one - WINDRES := i586-mingw32msvc-windres -endif - -INTERMEDIATE := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) -ANDROID_ICON_OBJ := android_icon.o -ANDROID_ICON_PATH := $(LOCAL_PATH)/images -$(ANDROID_ICON_PATH)/$(ANDROID_ICON_OBJ): $(ANDROID_ICON_PATH)/android_icon.rc - $(WINDRES) $< -I $(ANDROID_ICON_PATH) -o $@ - -# 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_PREBUILT_OBJ_FILES += images/$(ANDROID_ICON_OBJ) -endif - -# qemu-options.h is generated from qemu-options.hx with the "hxtool" shell script -# -intermediates := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) - -QEMU_OPTIONS_H := $(intermediates)/qemu-options.h -$(QEMU_OPTIONS_H): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_OPTIONS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/hxtool -h < $< > $@ -$(QEMU_OPTIONS_H): $(LOCAL_PATH)/qemu-options.hx $(LOCAL_PATH)/hxtool - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_OPTIONS_H) - -LOCAL_GENERATED_SOURCES += $(QEMU_OPTIONS_H) - -# qemu-monitor.h is generated from qemu-monitor.hx with the "hxtool" shell script -# -intermediates := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) - -QEMU_MONITOR_H := $(intermediates)/qemu-monitor.h -$(QEMU_MONITOR_H): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_MONITOR_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/hxtool -h < $< > $@ -$(QEMU_MONITOR_H): $(LOCAL_PATH)/qemu-monitor.hx $(LOCAL_PATH)/hxtool - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_MONITOR_H) - -LOCAL_GENERATED_SOURCES += $(QEMU_MONITOR_H) - - -# gdbstub-xml.c contains C-compilable arrays corresponding to the content -# of $(LOCAL_PATH)/gdb-xml/, and is generated with the 'feature_to_c.sh' script. -# -ifeq ($(QEMU_TARGET_XML_SOURCES),) - QEMU_TARGET_XML_SOURCES := arm-core arm-neon arm-vfp arm-vfp3 - QEMU_TARGET_XML_SOURCES := $(QEMU_TARGET_XML_SOURCES:%=$(LOCAL_PATH)/gdb-xml/%.xml) -endif - -QEMU_GDBSTUB_XML_C := $(intermediates)/gdbstub-xml.c -$(QEMU_GDBSTUB_XML_C): PRIVATE_PATH := $(LOCAL_PATH) -$(QEMU_GDBSTUB_XML_C): PRIVATE_SOURCES := $(TARGET_XML_SOURCES) -$(QEMU_GDBSTUB_XML_C): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/feature_to_c.sh $@ $(QEMU_TARGET_XML_SOURCES) -$(QEMU_GDBSTUB_XML_C): $(QEMU_TARGET_XML_SOURCES) $(LOCAL_PATH)/feature_to_c.sh - $(hide) rm -f $@ - $(transform-generated-source) - -$(intermediates)/vl-android.o: $(QEMU_GDBSTUB_XML_C) - -LOCAL_GENERATED_SOURCES += $(QEMU_GDBSTUB_XML_C) - -# this is already done by the Android build system, but is done for the -# benefit of the stand-alone one. -# -ifeq ($(BUILD_STANDALONE_EMULATOR),true) - LOCAL_CFLAGS += -I$(intermediates) -endif - -# other flags -ifneq ($(HOST_OS),windows) - LOCAL_LDLIBS += -ldl -endif - -LOCAL_LDLIBS += $(QEMU_AUDIO_LIB) - -ifeq ($(HOST_OS),darwin) - FRAMEWORKS := OpenGL Cocoa QuickTime ApplicationServices Carbon IOKit - LOCAL_LDLIBS += $(FRAMEWORKS:%=-Wl,-framework,%) -endif - -# Generate a completely static executable if needed. -# Note that this means no sound and graphics on Linux. -# -ifeq ($(CONFIG_STATIC_EXECUTABLE),true) - LOCAL_SRC_FILES += dynlink-static.c - LOCAL_LDLIBS += -static -endif - -LOCAL_MODULE_TAGS := debug - -include $(BUILD_HOST_EXECUTABLE) - ############################################################################## -# now build the emulator UI -# -include $(CLEAR_VARS) - -LOCAL_GENERATED_SOURCES := -LOCAL_NO_DEFAULT_COMPILER_FLAGS := true -LOCAL_CC := $(MY_CC) -LOCAL_MODULE := emulator-ui -LOCAL_STATIC_LIBRARIES := emulator-uilib -LOCAL_LDLIBS := $(MY_LDLIBS) +### +### emulator-ui: UI FRONT-END PROGRAM +### +### +$(call start-emulator-program, emulator-ui) -LOCAL_CFLAGS := $(MY_CFLAGS) $(LOCAL_CFLAGS) $(EMULATOR_UI_CFLAGS) $(EMULATOR_CORE_CFLAGS) +LOCAL_STATIC_LIBRARIES := \ + emulator-common \ + emulator-libui \ + emulator-common \ -# add the build ID to the default macro definitions -LOCAL_CFLAGS += $(UI_AND_CORE_CFLAGS) -DCONFIG_STANDALONE_UI -ifeq ($(HOST_ARCH),x86) -# enable MMX code for our skin scaler -LOCAL_CFLAGS += -DUSE_MMX=1 -mmmx -endif +LOCAL_CFLAGS += -DCONFIG_STANDALONE_UI=1 -# include other sources -# -VL_SOURCES := android/framebuffer.c \ - android/cmdline-option.c \ - android/config.c \ - android/looper-generic.c \ - android/snapshot.c \ - android/main-common.c \ - android/main.c \ - vl-android-ui.c \ - iolooper-select.c \ - android/protocol/core-connection.c \ - android/protocol/attach-ui-impl.c \ - android/protocol/fb-updates-impl.c \ - android/protocol/ui-commands-impl.c \ - android/protocol/core-commands-proxy.c \ - android/protocol/user-events-proxy.c \ +LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) $(EMULATOR_LIBUI_CFLAGS) +LOCAL_LDLIBS += $(EMULATOR_COMMON_LDLIBS) $(EMULATOR_LIBUI_LDLIBS) -# Add common system libraries -# -LOCAL_LDLIBS += $(QEMU_SYSTEM_LDLIBS) +LOCAL_SRC_FILES := \ + android/cmdline-option.c \ + android/config.c \ + android/help.c \ + android/looper-generic.c \ + android/snapshot.c \ + android/main-common.c \ + android/main.c \ + vl-android-ui.c \ + android/protocol/core-connection.c \ + android/protocol/attach-ui-impl.c \ + android/protocol/fb-updates-impl.c \ + android/protocol/ui-commands-impl.c \ + android/protocol/core-commands-proxy.c \ + android/protocol/user-events-proxy.c \ -LOCAL_SRC_FILES += $(VL_SOURCES) $(UI_SOURCES) $(UI_AND_CORE_SOURCES) +LOCAL_SRC_FILES += $(SDLMAIN_SOURCES) -# add SDL-specific flags -# -LOCAL_CFLAGS += $(SDL_CFLAGS) -LOCAL_LDLIBS += $(SDL_LDLIBS) LOCAL_STATIC_LIBRARIES += $(SDL_STATIC_LIBRARIES) -# 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... -# -ifeq ($(HOST_OS),windows) - -# Locate windres executable -WINDRES := windres -ifneq ($(USE_MINGW),) - # When building the Windows emulator under Linux, use the MinGW one - WINDRES := i586-mingw32msvc-windres -endif - -INTERMEDIATE := $(call intermediates-dir-for,EXECUTABLES,$(LOCAL_MODULE),true) -ANDROID_ICON_OBJ := android_icon.o -ANDROID_ICON_PATH := $(LOCAL_PATH)/images -$(ANDROID_ICON_PATH)/$(ANDROID_ICON_OBJ): $(ANDROID_ICON_PATH)/android_icon.rc - $(WINDRES) $< -I $(ANDROID_ICON_PATH) -o $@ - -# 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_PREBUILT_OBJ_FILES += images/$(ANDROID_ICON_OBJ) -endif - -# this is already done by the Android build system, but is done for the -# benefit of the stand-alone one. -# -ifeq ($(BUILD_STANDALONE_EMULATOR),true) - LOCAL_CFLAGS += -I$(intermediates) -endif - -# Generate a completely static executable if needed. -# Note that this means no sound and graphics on Linux. -# -ifeq ($(CONFIG_STATIC_EXECUTABLE),true) - LOCAL_SRC_FILES += dynlink-static.c - LOCAL_LDLIBS += -static -endif - -# See comment about SDLMAIN_SOURCES in the 'emulator-uilib' module declarations. -LOCAL_SRC_FILES += $(SDLMAIN_SOURCES) +$(call end-emulator-program) -include $(BUILD_HOST_EXECUTABLE) +## VOILA!! endif # TARGET_ARCH == arm || TARGET_ARCH == x86 diff --git a/Makefile.common b/Makefile.common new file mode 100644 index 0000000..e872734 --- /dev/null +++ b/Makefile.common @@ -0,0 +1,613 @@ +# When building this project, we actually generate several components which +# are the following: +# +# - the emulator-ui program (which is target-agnostic) +# - the target-specific qemu-android-$ARCH programs (headless emulation engines) +# - the "standalone" emulator programs (embed both UI and engine in a single +# binary and process), i.e. "emulator" for ARM and "emulator-x86" for x86. +# +# This file defines static host libraries that will be used by at least two +# of these components. +# + +############################################################################## +############################################################################## +### +### emulator-common: LIBRARY OF COMMON FUNCTIONS +### +### THESE ARE POTENTIALLY USED BY ALL COMPONENTS +### + +$(call start-emulator-library, emulator-common) + +EMULATOR_COMMON_CFLAGS := + +# Needed by everything about the host +EMULATOR_COMMON_CFLAGS += \ + -I$(LOCAL_PATH)/android/config/$(QEMU_HOST_TAG) + +# add the build ID to the default macro definitions +ifeq ($(BUILD_STANDALONE_EMULATOR),) +EMULATOR_COMMON_CFLAGS += -DANDROID_BUILD_ID="$(strip $(BUILD_ID))-$(strip $(BUILD_NUMBER))" +endif + +# For non-standalone builds, extract the major version number from the Android SDK +# tools revision number. +ifneq ($(BUILD_STANDALONE_EMULATOR),true) + ANDROID_SDK_TOOLS_REVISION := $(shell awk -F= '/Pkg.Revision/ { print $$2; }' sdk/files/tools_source.properties) +endif + +ANDROID_SDK_TOOLS_REVISION := $(strip $(ANDROID_SDK_TOOLS_REVISION)) +ifdef ANDROID_SDK_TOOLS_REVISION + EMULATOR_COMMON_CFLAGS += -DANDROID_SDK_TOOLS_REVISION=$(ANDROID_SDK_TOOLS_REVISION) +endif + +# Enable large-file support (i.e. make off_t a 64-bit value) +ifeq ($(HOST_OS),linux) +EMULATOR_COMMON_CFLAGS += -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE +endif + +########################################################### +# Zlib sources +# +ZLIB_DIR := distrib/zlib-1.2.3 +include $(LOCAL_PATH)/$(ZLIB_DIR)/sources.make +EMULATOR_COMMON_CFLAGS += -I$(LOCAL_PATH)/$(ZLIB_DIR) + +LOCAL_SRC_FILES += $(ZLIB_SOURCES) + +########################################################### +# Android utility functions +# +LOCAL_SRC_FILES += \ + sockets.c \ + iolooper-select.c \ + android/async-console.c \ + android/async-utils.c \ + android/charmap.c \ + android/framebuffer.c \ + android/keycode-array.c \ + android/avd/hw-config.c \ + android/avd/info.c \ + android/sync-utils.c \ + android/utils/assert.c \ + android/utils/bufprint.c \ + android/utils/debug.c \ + android/utils/dirscanner.c \ + android/utils/filelock.c \ + android/utils/ini.c \ + android/utils/mapfile.c \ + android/utils/misc.c \ + android/utils/panic.c \ + android/utils/path.c \ + android/utils/reflist.c \ + android/utils/refset.c \ + android/utils/stralloc.c \ + android/utils/system.c \ + android/utils/tempfile.c \ + android/utils/vector.c \ + +LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) + +$(call end-emulator-library) + +############################################################################## +############################################################################## +### +### emulator-libui: LIBRARY OF UI-RELATED FUNCTIONS +### +### THESE ARE USED BY 'emulator-ui' AND THE STANDALONE PROGRAMS +### + +$(call start-emulator-library, emulator-libui) + +EMULATOR_LIBUI_CFLAGS := + +LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) + +########################################################### +# Libpng configuration +# +LIBPNG_DIR := distrib/libpng-1.2.19 +include $(LOCAL_PATH)/$(LIBPNG_DIR)/sources.make + +EMULATOR_LIBUI_CFLAGS += \ + $(LIBPNG_CFLAGS) \ + -I$(LOCAL_PATH)/$(LIBPNG_DIR) + +LOCAL_SRC_FILES += $(LIBPNG_SOURCES) loadpng.c + +############################################################################## +# SDL-related definitions +# + +# Build SDL from sources except in certain cases where we use +# prebuilt libraries instead. +# +BUILD_SDL_FROM_SOURCES := true + +# On linux-x86, using the prebuilts avoid installing all the X11 +# development packages on our build servers. +# +ifeq ($(QEMU_HOST_TAG),linux-x86) + BUILD_SDL_FROM_SOURCES := false +endif + +# On darwin-x86, a bug in the Android build system prevents the compilation +# of Objective-C sources. Fixed recently in AOSP, but we still use the +# prebuilts for the benefit of older platform branches. +# +ifeq ($(QEMU_HOST_TAG),darwin-x86) + BUILD_SDL_FROM_SOURCES := false +endif + +# If we're building with android-configure.sh && make, always build from +# sources to catch regressions as soon as they happen. +# +ifeq ($(BUILD_STANDALONE_EMULATOR),true) + BUILD_SDL_FROM_SOURCES := true +endif + +# Except if we used android-configure.sh --sdl-config=<script> +# +ifneq ($(SDL_CONFIG),) + BUILD_SDL_FROM_SOURCES := false +endif + +ifneq ($(BUILD_SDL_FROM_SOURCES),true) + + SDL_CONFIG ?= prebuilt/$(QEMU_HOST_TAG)/sdl/bin/sdl-config + SDL_CFLAGS := $(shell $(SDL_CONFIG) --cflags) + + # We need to filter out the _GNU_SOURCE variable because it breaks recent + # releases of Cygwin when using the -mno-cygwin option. Moreover, we don't + # need this macro at all to build the Android emulator. + SDL_CFLAGS := $(filter-out -D_GNU_SOURCE=1,$(SDL_CFLAGS)) + SDL_LDLIBS := $(filter-out %.a %.lib,$(shell $(SDL_CONFIG) --static-libs)) + + # Circular dependencies between libSDL and libSDLmain + # We repeat the libraries in the final link to work around it + SDL_STATIC_LIBRARIES := libSDL libSDLmain libSDL libSDLmain + +else # BUILD_SDL_FROM_SOURCES + + SDL_DIR := distrib/sdl-1.2.12 + include $(LOCAL_PATH)/$(SDL_DIR)/sources.make + LOCAL_SRC_FILES += $(SDL_SOURCES) + + EMULATOR_LIBUI_CFLAGS += \ + -I$(LOCAL_PATH)/$(SDL_DIR)/include + + SDL_STATIC_LIBRARIES := + +endif # BUILD_SDL_FROM_SOURCES + +EMULATOR_LIBUI_CFLAGS += $(SDL_CFLAGS) +EMULATOR_LIBUI_LDLIBS += $(SDL_LDLIBS) + +# The following is needed by SDL_LoadObject +ifneq ($(HOST_OS),windows) + EMULATOR_LIBUI_LDLIBS += -ldl +endif + +# the skin support sources +# +SKIN_SOURCES := rect.c \ + region.c \ + image.c \ + trackball.c \ + keyboard.c \ + keyset.c \ + file.c \ + window.c \ + scaler.c \ + composer.c \ + surface.c \ + +LOCAL_SRC_FILES += $(SKIN_SOURCES:%=android/skin/%) + +LOCAL_SRC_FILES += \ + android/user-config.c \ + android/resource.c \ + android/qemulator.c \ + android/keycode.c \ + +# enable MMX code for our skin scaler +ifeq ($(HOST_ARCH),x86) +LOCAL_CFLAGS += -DUSE_MMX=1 -mmmx +endif + +LOCAL_CFLAGS += $(EMULATOR_LIBUI_CFLAGS) + +$(call end-emulator-library) + +############################################################################## +############################################################################## +### +### emulator-libqemu: TARGET-INDEPENDENT QEMU FUNCTIONS +### +### THESE ARE USED BY EVERYTHING EXCEPT 'emulator-ui' +### + +$(call start-emulator-library, emulator-libqemu) + +EMULATOR_LIBQEMU_CFLAGS := + +LOCAL_CFLAGS += $(EMULATOR_COMMON_CFLAGS) + +AUDIO_SOURCES := noaudio.c wavaudio.c wavcapture.c mixeng.c +AUDIO_CFLAGS := -I$(LOCAL_PATH)/audio -DHAS_AUDIO +AUDIO_LDLIBS := + +LOCAL_CFLAGS += -Wall -Wno-missing-field-initializers + +ifeq ($(HOST_OS),darwin) + CONFIG_COREAUDIO ?= yes + AUDIO_CFLAGS += -DHOST_BSD=1 +endif + +ifeq ($(HOST_OS),windows) + CONFIG_WINAUDIO ?= yes +endif + +ifeq ($(HOST_OS),linux) + CONFIG_OSS ?= yes + CONFIG_ALSA ?= yes + CONFIG_PULSEAUDIO ?= yes + CONFIG_ESD ?= yes +endif + +ifeq ($(HOST_OS),freebsd) + CONFIG_OSS ?= yes +endif + +ifeq ($(CONFIG_COREAUDIO),yes) + AUDIO_SOURCES += coreaudio.c + AUDIO_CFLAGS += -DCONFIG_COREAUDIO + AUDIO_LDLIBS += -Wl,-framework,CoreAudio +endif + +ifeq ($(CONFIG_WINAUDIO),yes) + AUDIO_SOURCES += winaudio.c + AUDIO_CFLAGS += -DCONFIG_WINAUDIO +endif + +ifeq ($(CONFIG_PULSEAUDIO),yes) + AUDIO_SOURCES += paaudio.c audio_pt_int.c + AUDIO_CFLAGS += -DCONFIG_PULSEAUDIO +endif + +ifeq ($(CONFIG_ALSA),yes) + AUDIO_SOURCES += alsaaudio.c audio_pt_int.c + AUDIO_CFLAGS += -DCONFIG_ALSA +endif + +ifeq ($(CONFIG_ESD),yes) + AUDIO_SOURCES += esdaudio.c + AUDIO_CFLAGS += -DCONFIG_ESD +endif + +ifeq ($(CONFIG_OSS),yes) + AUDIO_SOURCES += ossaudio.c + AUDIO_CFLAGS += -DCONFIG_OSS +endif + +AUDIO_SOURCES := $(call sort,$(AUDIO_SOURCES:%=audio/%)) + +LOCAL_CFLAGS += -Wno-sign-compare \ + -fno-strict-aliasing -W -Wall -Wno-unused-parameter \ + +# this is very important, otherwise the generated binaries may +# not link properly on our build servers +ifeq ($(HOST_OS),linux) +LOCAL_CFLAGS += -fno-stack-protector +endif + +LOCAL_SRC_FILES += $(AUDIO_SOURCES) +LOCAL_SRC_FILES += \ + android/audio-test.c + +# other flags +ifneq ($(HOST_OS),windows) + AUDIO_LDLIBS += -ldl +else +endif + + +EMULATOR_LIBQEMU_CFLAGS += $(AUDIO_CFLAGS) +EMULATOR_LIBQEMU_LDLIBS += $(AUDIO_LDLIBS) + +LOCAL_CFLAGS += -Wno-missing-field-initializers + +# migration sources +# +ifeq ($(HOST_OS),windows) + LOCAL_SRC_FILES += migration-dummy-android.c +else + LOCAL_SRC_FILES += migration.c \ + migration-exec.c \ + migration-tcp-android.c +endif + +# misc. sources +# +CORE_MISC_SOURCES = \ + acl.c \ + aes.c \ + aio-android.c \ + async.c \ + bt-host.c \ + bt-vhci.c \ + buffered_file.c \ + cbuffer.c \ + charpipe.c \ + console.c \ + cutils.c \ + d3des.c \ + input.c \ + ioport.c \ + module.c \ + net-android.c \ + notify.c \ + osdep.c \ + outputchannel.c \ + path.c \ + qemu-char-android.c \ + qemu-config.c \ + qemu-error.c \ + qemu-malloc.c \ + qemu-option.c \ + qemu-sockets-android.c \ + qerror.c \ + readline.c \ + savevm.c \ + shaper.c \ + tcpdump.c \ + vnc-android.c \ + android/boot-properties.c \ + android/config.c \ + android/core-init-utils.c \ + android/gps.c \ + android/hw-kmsg.c \ + android/hw-lcd.c \ + android/hw-events.c \ + android/hw-control.c \ + android/hw-sensors.c \ + android/hw-qemud.c \ + android/looper-qemu.c \ + android/qemu-setup.c \ + android/snapshot.c \ + android/utils/timezone.c \ + +ifeq ($(HOST_ARCH),x86) + CORE_MISC_SOURCES += i386-dis.c +endif +ifeq ($(HOST_ARCH),x86_64) + CORE_MISC_SOURCES += i386-dis.c +endif +ifeq ($(HOST_ARCH),ppc) + CORE_MISC_SOURCES += ppc-dis.c \ + cache-utils.c +endif + +ifeq ($(HOST_OS),linux) + CORE_MISC_SOURCES += usb-linux.c \ + qemu-thread.c +else + CORE_MISC_SOURCES += usb-dummy-android.c +endif + +ifeq ($(HOST_OS),windows) + CORE_MISC_SOURCES += tap-win32.c +else + CORE_MISC_SOURCES += posix-aio-compat.c +endif + +LOCAL_SRC_FILES += $(CORE_MISC_SOURCES) + +# Required +LOCAL_CFLAGS += -D_XOPEN_SOURCE=600 -D_BSD_SOURCE=1 + +SLIRP_SOURCES := \ + bootp.c \ + cksum.c \ + debug.c \ + if.c \ + ip_icmp.c \ + ip_input.c \ + ip_output.c \ + mbuf.c \ + misc.c \ + sbuf.c \ + slirp.c \ + socket.c \ + tcp_input.c \ + tcp_output.c \ + tcp_subr.c \ + tcp_timer.c \ + tftp.c \ + udp.c + +LOCAL_SRC_FILES += $(SLIRP_SOURCES:%=slirp-android/%) +EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/slirp-android + +# socket proxy support +# +PROXY_SOURCES := \ + proxy_common.c \ + proxy_http.c \ + proxy_http_connector.c \ + proxy_http_rewriter.c \ + +LOCAL_SRC_FILES += $(PROXY_SOURCES:%=proxy/%) +EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/proxy + +# include telephony stuff +# +TELEPHONY_SOURCES := \ + android_modem.c \ + modem_driver.c \ + gsm.c \ + sim_card.c \ + sysdeps_qemu.c \ + sms.c \ + remote_call.c + +LOCAL_SRC_FILES += $(TELEPHONY_SOURCES:%=telephony/%) +EMULATOR_LIBQEMU_CFLAGS += -I$(LOCAL_PATH)/telephony + +# sources inherited from upstream, but not fully +# integrated into android emulator +# +LOCAL_SRC_FILES += \ + json-lexer.c \ + json-parser.c \ + json-streamer.c \ + qjson.c \ + qbool.c \ + qdict.c \ + qfloat.c \ + qint.c \ + qlist.c \ + qstring.c \ + +# hw-config-defs.h is generated from android/avd/hardware-properties.ini +# +QEMU_HARDWARE_PROPERTIES_INI := $(LOCAL_PATH)/android/avd/hardware-properties.ini +QEMU_HW_CONFIG_DEFS_H := $(LOCAL_PATH)/android/avd/hw-config-defs.h +$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_PATH := $(LOCAL_PATH) +$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_SOURCES := $(QEMU_HARDWARE_PROPERTIES_INI) +$(QEMU_HW_CONFIG_DEFS_H): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/android/tools/gen-hw-config.py $(QEMU_HARDWARE_PROPERTIES_INI) $@ +$(QEMU_HW_CONFIG_DEFS_H): $(QEMU_HARDWARE_PROPERTIES_INI) $(LOCAL_PATH)/android/tools/gen-hw-config.py + $(hide) rm -f $@ + $(transform-generated-source) + +$(LOCAL_PATH)/android/avd/hw-config.h: $(QEMU_HW_CONFIG_DEFS_H) + +# gdbstub-xml.c contains C-compilable arrays corresponding to the content +# of $(LOCAL_PATH)/gdb-xml/, and is generated with the 'feature_to_c.sh' script. +# +intermediates := $(call intermediates-dir-for,STATIC_LIBRARIES,$(LOCAL_MODULE),true) + +ifeq ($(QEMU_TARGET_XML_SOURCES),) + QEMU_TARGET_XML_SOURCES := arm-core arm-neon arm-vfp arm-vfp3 + QEMU_TARGET_XML_SOURCES := $(QEMU_TARGET_XML_SOURCES:%=$(LOCAL_PATH)/gdb-xml/%.xml) +endif + +QEMU_GDBSTUB_XML_C := $(intermediates)/gdbstub-xml.c +$(QEMU_GDBSTUB_XML_C): PRIVATE_PATH := $(LOCAL_PATH) +$(QEMU_GDBSTUB_XML_C): PRIVATE_SOURCES := $(TARGET_XML_SOURCES) +$(QEMU_GDBSTUB_XML_C): PRIVATE_CUSTOM_TOOL = $(PRIVATE_PATH)/feature_to_c.sh $@ $(QEMU_TARGET_XML_SOURCES) +$(QEMU_GDBSTUB_XML_C): $(QEMU_TARGET_XML_SOURCES) $(LOCAL_PATH)/feature_to_c.sh + $(hide) rm -f $@ + $(transform-generated-source) + +LOCAL_GENERATED_SOURCES += $(QEMU_GDBSTUB_XML_C) + +EMULATOR_LIBQEMU_CFLAGS += -I$(intermediates) + +LOCAL_CFLAGS += $(EMULATOR_LIBQEMU_CFLAGS) + +$(call end-emulator-library) + +# Block sources, we must compile them with each executable because they +# are only referenced by the rest of the code using constructor functions. +# If their object files are put in a static library, these are never compiled +# into the final linked executable that uses them. +# +# Normally, one would solve thus using LOCAL_WHOLE_STATIC_LIBRARIES, but +# the Darwin linker doesn't support -Wl,--whole-archive or equivalent :-( +# +BLOCK_SOURCES += \ + block.c \ + blockdev.c \ + block/qcow.c \ + block/qcow2.c \ + block/qcow2-refcount.c \ + block/qcow2-snapshot.c \ + block/qcow2-cluster.c \ + block/cloop.c \ + block/dmg.c \ + block/vvfat.c \ + block/raw.c + +ifeq ($(HOST_OS),windows) + BLOCK_SOURCES += block/raw-win32.c +else + BLOCK_SOURCES += block/raw-posix.c +endif + +BLOCK_CFLAGS += $(EMULATOR_COMMON_CFLAGS) +BLOCK_CFLAGS += -DCONFIG_BDRV_WHITELIST="" + + +############################################################################## +############################################################################## +### +### emulator-libelff: TARGET-INDEPENDENT ELF/DWARD PARSER +### +### THESE ARE USED BY EVERYTHING EXCEPT 'emulator-ui', BUT WE CANNOT PUT +### THEM IN emulator-libqemu SINCE THE SOURCES ARE C++ +### + +$(call start-emulator-library, emulator-libelff) + +LOCAL_CPP_EXTENSION := .cc + +ELFF_CFLAGS := -I$(LOCAL_PATH)/elff +ELFF_LDLIBS := -lstdc++ + +ELFF_SOURCES := \ + dwarf_cu.cc \ + dwarf_die.cc \ + dwarf_utils.cc \ + elf_alloc.cc \ + elf_file.cc \ + elf_mapped_section.cc \ + elff_api.cc \ + +LOCAL_SRC_FILES += $(ELFF_SOURCES:%=elff/%) + +LOCAL_CFLAGS += \ + -fno-exceptions \ + $(ELFF_CFLAGS) \ + +$(call end-emulator-library) + + +############################################################################## +############################################################################## +### +### gen-hx-header: Generate headers from .hx file with "hxtool" script. +### +### The 'hxtool' script is used to generate header files from an input +### file with the .hx suffix. I.e. foo.hx --> foo.h +### +### Due to the way the Android build system works, we need to regenerate +### it for each module (the output will go into a module-specific directory). +### +### This defines a function that can be used inside a module definition +### +### $(call gen-hx-header,<input>,<source-files>) +### +### Where: <input> is the input file, with a .hx suffix (e.g. foo.hx) +### <source-files> is a list of source files that include the header +### + + +gen-hx-header = $(eval $(call gen-hx-header-ev,$1,$2,$3)) + +define gen-hx-header-ev +intermediates := $$(call intermediates-dir-for,EXECUTABLES,$$(LOCAL_MODULE),true) + +QEMU_HEADER_H := $$(intermediates)/$$(1:%.hx=%.h) +$$(QEMU_HEADER_H): PRIVATE_PATH := $$(LOCAL_PATH) +$$(QEMU_HEADER_H): PRIVATE_CUSTOM_TOOL = $$(PRIVATE_PATH)/hxtool -h < $$< > $$@ +$$(QEMU_HEADER_H): $$(LOCAL_PATH)/$$1 $$(LOCAL_PATH)/hxtool + $$(transform-generated-source) + +LOCAL_GENERATED_SOURCES += $$(QEMU_HEADER_H) +_objects := $$(patsubst %,$$(intermediates)/%,$$(2:.c=.o)) +$$(_objects): $$(QEMU_HEADER_H) +endef + diff --git a/Makefile.target b/Makefile.target new file mode 100644 index 0000000..ab263bd --- /dev/null +++ b/Makefile.target @@ -0,0 +1,353 @@ +# This file is included several times to build target-specific +# modules for the Android emulator. It will be called several times +# (e.g. once for the arm target, and once for the x86 target). +# + +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 ($(TCG_TARGET),x86) + TCG_TARGET := i386 +endif + +EMULATOR_TARGET_CFLAGS += \ + -I$(LOCAL_PATH)/tcg \ + -I$(LOCAL_PATH)/tcg/$(TCG_TARGET) \ + -DTARGET_ARCH=\"$(EMULATOR_TARGET_ARCH)\" + + +$(call start-emulator-library, emulator-target-$(EMULATOR_TARGET_CPU)) + +# The following is to ensure that "config.h" will map to a target-specific +# configuration file header. +LOCAL_CFLAGS += $(EMULATOR_TARGET_CFLAGS) + +LOCAL_SRC_FILES += \ + tcg/tcg.c \ + +############################################################################## +# Emulated hardware devices. +# + +HW_SOURCES := \ + bt.c \ + bt-hci.c \ + bt-hid.c \ + bt-l2cap.c \ + bt-sdp.c \ + cdrom.c \ + dma.c \ + irq.c \ + goldfish_device.c \ + goldfish_events_device.c \ + goldfish_fb.c \ + goldfish_battery.c \ + goldfish_mmc.c \ + goldfish_memlog.c \ + goldfish_nand.c \ + goldfish_tty.c \ + msmouse.c \ + pci.c \ + qdev.c \ + scsi-disk.c \ + sysbus.c \ + usb-hid.c \ + usb-hub.c \ + usb-msd.c \ + usb-ohci.c \ + usb.c \ + watchdog.c + +ifeq ($(EMULATOR_TARGET_ARCH),arm) +HW_SOURCES += android_arm.c \ + arm_pic.c \ + goldfish_audio.c \ + goldfish_interrupt.c \ + goldfish_switch.c \ + goldfish_timer.c \ + goldfish_trace.c \ + arm_boot.c \ + +# The following sources must be compiled with the final executables +# because they contain device_init() or machine_init() statements. +HW_OBJ_SOURCES := hw/smc91c111.c +HW_OBJ_CFLAGS := $(EMULATOR_TARGET_CFLAGS) + +LOCAL_SRC_FILES += arm-dis.c + +# smc91c111.c requires <zlib.h> +LOCAL_CFLAGS += $(ZLIB_CFLAGS) +endif + +ifeq ($(EMULATOR_TARGET_ARCH),x86) +HW_SOURCES += \ + apic.c \ + i8259.c \ + mc146818rtc.c \ + piix_pci.c \ + i8254.c \ + pckbd.c \ + ioapic.c \ + ps2.c \ + smbios.c \ + 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/ne2000.c \ + hw/pc.c + +HW_OBJ_CFLAGS := $(EMULATOR_TARGET_CFLAGS) + +endif + +LOCAL_SRC_FILES += $(HW_SOURCES:%=hw/%) + +LOCAL_SRC_FILES += \ + exec.c \ + cpu-exec.c \ + translate-all.c \ + trace.c \ + varint.c \ + dcache.c \ + softmmu_outside_jit.c \ + +############################################################################## +# CPU-specific emulation. +# +LOCAL_CFLAGS += -fno-PIC -fomit-frame-pointer -Wno-sign-compare + +ifeq ($(HOST_ARCH),ppc) + LOCAL_CFLAGS += -D__powerpc__ +endif + +ifeq ($(EMULATOR_TARGET_ARCH),arm) +LOCAL_SRC_FILES += \ + target-arm/op_helper.c \ + target-arm/iwmmxt_helper.c \ + target-arm/neon_helper.c \ + target-arm/helper.c \ + target-arm/translate.c \ + target-arm/machine.c \ + hw/armv7m.c \ + hw/armv7m_nvic.c \ + arm-semi.c \ + +LOCAL_SRC_FILES += fpu/softfloat.c +endif + +ifeq ($(EMULATOR_TARGET_ARCH), x86) +LOCAL_SRC_FILES += \ + target-i386/op_helper.c \ + target-i386/helper.c \ + target-i386/translate.c \ + target-i386/machine.c \ + +LOCAL_SRC_FILES += fpu/softfloat-native.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. +# +LOCAL_CFLAGS += \ + -I$(LOCAL_PATH)/memcheck \ + -I$(LOCAL_PATH)/elff + +MCHK_SOURCES := \ + memcheck.c \ + memcheck_proc_management.c \ + memcheck_malloc_map.c \ + memcheck_mmrange_map.c \ + memcheck_util.c \ + +LOCAL_SRC_FILES += $(MCHK_SOURCES:%=memcheck/%) + + +$(call end-emulator-library) + +############################################################################## +############################################################################## +### +### qemu-android-$CPU: headless emulator core program +### +### +$(call start-emulator-program, qemu-android-$(EMULATOR_TARGET_ARCH)) + +LOCAL_CFLAGS += \ + $(EMULATOR_COMMON_CFLAGS) \ + $(ELFF_CFLAGS) \ + $(EMULATOR_LIBQEMU_CFLAGS) \ + $(EMULATOR_TARGET_CFLAGS) \ + -DCONFIG_STANDALONE_CORE \ + +LOCAL_CFLAGS += -Wno-missing-field-initializers + + +LOCAL_STATIC_LIBRARIES := \ + emulator-libqemu \ + emulator-target-$(EMULATOR_TARGET_CPU) \ + emulator-libelff \ + emulator-common \ + + +LOCAL_LDLIBS += \ + $(EMULATOR_COMMON_LDLIBS) \ + $(EMULATOR_LIBQEMU_LDLIBS) \ + $(ELFF_LDLIBS) \ + +LOCAL_SRC_FILES := \ + audio/audio.c \ + disas.c \ + dma-helpers.c \ + gdbstub.c \ + keymaps.c \ + loader.c \ + monitor.c \ + qemu-timer.c \ + user-events-qemu.c \ + vl-android.c \ + android/console.c \ + android/display-core.c \ + android/protocol/attach-ui-proxy.c \ + android/protocol/fb-updates-proxy.c \ + android/protocol/user-events-impl.c \ + android/protocol/ui-commands-proxy.c \ + android/protocol/core-commands-impl.c \ + android/protocol/core-commands-qemu.c \ + +$(call gen-hx-header,qemu-monitor.hx,monitor.c) +$(call gen-hx-header,qemu-options.hx,vl-android.c) + +ifeq ($(HOST_OS),darwin) + FRAMEWORKS := OpenGL Cocoa QuickTime ApplicationServices Carbon IOKit + LOCAL_LDLIBS += $(FRAMEWORKS:%=-Wl,-framework,%) +endif + +# Generate a completely static executable if needed. +# Note that this means no sound and graphics on Linux. +# +ifeq ($(CONFIG_STATIC_EXECUTABLE),true) + LOCAL_SRC_FILES += dynlink-static.c + LOCAL_LDLIBS += -static +endif + +# The following files cannot be in static libraries because they contain +# constructor functions that are otherwise stripped by the final linker +LOCAL_SRC_FILES += $(HW_OBJ_SOURCES) +LOCAL_CFLAGS += $(HW_OBJ_CFLAGS) + +LOCAL_SRC_FILES += $(BLOCK_SOURCES) +LOCAL_CFLAGS += $(BLOCK_CFLAGS) + +LOCAL_MODULE_TAGS := debug + +$(call end-emulator-program) + +############################################################################## +############################################################################## +### +### emulator-$ARCH: Standalone emulator program +### +### + +# Special case, "emulator-arm" is named "emulator" for now. +ifeq ($(EMULATOR_TARGET_ARCH),arm) +$(call start-emulator-program, emulator) +else +$(call start-emulator-program, emulator-$(EMULATOR_TARGET_ARCH)) +endif + +LOCAL_STATIC_LIBRARIES := \ + emulator-libui \ + emulator-libqemu \ + emulator-target-$(EMULATOR_TARGET_CPU) \ + emulator-libelff \ + emulator-common \ + +LOCAL_LDLIBS += \ + $(EMULATOR_COMMON_LDLIBS) \ + $(EMULATOR_LIBQEMU_LDLIBS) \ + $(EMULATOR_LIBUI_LDLIBS) \ + $(ELFF_LDLIBS) \ + +LOCAL_CFLAGS += \ + $(EMULATOR_TARGET_CFLAGS) \ + $(EMULATOR_COMMON_CFLAGS) \ + $(EMULATOR_LIBQEMU_CFLAGS) \ + $(EMULATOR_LIBUI_CFLAGS) + +LOCAL_SRC_FILES := \ + audio/audio.c \ + disas.c \ + dma-helpers.c \ + gdbstub.c \ + keymaps.c \ + loader.c \ + monitor.c \ + qemu-timer.c \ + user-events-qemu.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/protocol/core-commands-qemu.c \ + android/protocol/ui-commands-qemu.c \ + android/ + +$(call gen-hx-header,qemu-monitor.hx,monitor.c) +$(call gen-hx-header,qemu-options.hx,vl-android.c) + +# The following files cannot be in static libraries because they contain +# constructor functions that are otherwise stripped by the final linker +LOCAL_SRC_FILES += $(HW_OBJ_SOURCES) +LOCAL_CFLAGS += $(HW_OBJ_CFLAGS) + +LOCAL_SRC_FILES += $(BLOCK_SOURCES) +LOCAL_CFLAGS += $(BLOCK_CFLAGS) + +LOCAL_SRC_FILES += $(SDLMAIN_SOURCES) + +# Generate a completely static executable if needed. +# Note that this means no sound and graphics on Linux. +# +ifeq ($(CONFIG_STATIC_EXECUTABLE),true) + LOCAL_SRC_FILES += dynlink-static.c + LOCAL_LDLIBS += -static +endif + +LOCAL_STATIC_LIBRARIES += $(SDL_STATIC_LIBRARIES) + +$(call end-emulator-program) diff --git a/android/build/definitions.make b/android/build/definitions.make index 663899d..e31131b 100644 --- a/android/build/definitions.make +++ b/android/build/definitions.make @@ -55,7 +55,7 @@ SRC:=$(1) OBJ:=$$(LOCAL_OBJS_DIR)/$$(SRC:%.c=%.o) LOCAL_OBJECTS += $$(OBJ) DEPENDENCY_DIRS += $$(dir $$(OBJ)) -$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(OBJS_DIR) +$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR) $$(OBJ): PRIVATE_CC := $$(LOCAL_CC) $$(OBJ): PRIVATE_OBJ := $$(OBJ) $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) @@ -75,7 +75,7 @@ SRC:=$(1) OBJ:=$$(LOCAL_OBJS_DIR)/$$(SRC:%$(LOCAL_CPP_EXTENSION)=%.o) LOCAL_OBJECTS += $$(OBJ) DEPENDENCY_DIRS += $$(dir $$(OBJ)) -$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(OBJS_DIR) +$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR) $$(OBJ): PRIVATE_CXX := $$(LOCAL_CC) $$(OBJ): PRIVATE_OBJ := $$(OBJ) $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) @@ -95,7 +95,7 @@ SRC:=$(1) OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.m=%.o)) LOCAL_OBJECTS += $$(OBJ) DEPENDENCY_DIRS += $$(dir $$(OBJ)) -$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(OBJS_DIR) +$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR) $$(OBJ): PRIVATE_CC := $$(LOCAL_CC) $$(OBJ): PRIVATE_OBJ := $$(OBJ) $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) @@ -115,7 +115,7 @@ SRC:=$(1) OBJ:=$$(LOCAL_OBJS_DIR)/$$(notdir $$(SRC:%.c=%.o)) LOCAL_OBJECTS += $$(OBJ) DEPENDENCY_DIRS += $$(dir $$(OBJ)) -$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(OBJS_DIR) +$$(OBJ): PRIVATE_CFLAGS := $$(CFLAGS) $$(LOCAL_CFLAGS) -I$$(LOCAL_PATH) -I$$(LOCAL_OBJS_DIR) $$(OBJ): PRIVATE_CC := $$(LOCAL_CC) $$(OBJ): PRIVATE_OBJ := $$(OBJ) $$(OBJ): PRIVATE_MODULE := $$(LOCAL_MODULE) diff --git a/android/config/config.h b/android/config/config.h index fdfbe31..e07cc2c 100644 --- a/android/config/config.h +++ b/android/config/config.h @@ -1,4 +1,9 @@ -/* Automatically generated by configure - do not modify */ +/* This file is included by target-specific files under + * android/config/target-$ARCH/config.h, but contains all config + * definitions that are independent of the target CPU. + * + * Do not include directly. + */ #include "config-host.h" #define TARGET_PHYS_ADDR_BITS 32 @@ -11,13 +16,4 @@ #define CONFIG_NAND_LIMITS 1 #endif #define CONFIG_ANDROID_SNAPSHOTS 1 - -#ifdef ARCH_FLAGS_x86 -#define TARGET_ARCH "x86" -#define TARGET_I386 1 -#else -#define TARGET_ARCH "arm" -#define TARGET_ARM 1 -#define CONFIG_SOFTFLOAT 1 -#endif - +#define CONFIG_MEMCHECK 1 diff --git a/android/config/target-arm/config.h b/android/config/target-arm/config.h new file mode 100644 index 0000000..d6da04f --- /dev/null +++ b/android/config/target-arm/config.h @@ -0,0 +1,5 @@ +/* ARM-specific configuration */ +#include "android/config/config.h" + +#define TARGET_ARM 1 +#define CONFIG_SOFTFLOAT 1 diff --git a/android/config/target-x86/config.h b/android/config/target-x86/config.h new file mode 100644 index 0000000..ea31c39 --- /dev/null +++ b/android/config/target-x86/config.h @@ -0,0 +1,3 @@ +/* x86-specific configuration */ +#include "android/config/config.h" +#define TARGET_I386 1 |