include config.mak include $(SRC_PATH)/distrib/Makefile TARGET_BASE_ARCH:=$(TARGET_ARCH) TARGET_PATH=$(SRC_PATH)/target-$(TARGET_BASE_ARCH) VPATH=$(SRC_PATH):$(TARGET_PATH):$(SRC_PATH)/hw:$(SRC_PATH)/audio:$(SRC_PATH)/telephony:$(SRC_PATH)/proxy:$(SRC_PATH)/skins DEFINES=-I. -I.. -I$(TARGET_PATH) -I$(SRC_PATH) -I$(SRC_PATH)/telephony -I$(SRC_PATH)/proxy -I$(SRC_PATH)/skins CFLAGS=-Wall $(OPTIM) -g $(ZLIB_CFLAGS) $(LIBPNG_CFLAGS) -MMD -MP ifeq ($(CONFIG_DARWIN),yes) CFLAGS+=-mdynamic-no-pic endif #CFLAGS+=-Werror LDFLAGS=-g LIBS= HELPER_CFLAGS=$(CFLAGS) DYNGEN=../dyngen$(EXESUF) # user emulator name TARGET_ARCH2=$(TARGET_ARCH) ifeq ($(TARGET_ARCH),arm) ifeq ($(TARGET_WORDS_BIGENDIAN),yes) TARGET_ARCH2=armeb endif endif # system emulator name ifdef CONFIG_SOFTMMU QEMU_SYSTEM=qemu-system-$(TARGET_ARCH2)$(EXESUF) else QEMU_SYSTEM=qemu-fast endif PROGS+=$(QEMU_SYSTEM) ifndef CONFIG_SOFTMMU CONFIG_STATIC=y endif ifdef CONFIG_STATIC LDFLAGS+=-static endif ifeq ($(ARCH),i386) OP_CFLAGS=$(CFLAGS) -O2 -fomit-frame-pointer CFLAGS+=-DUSE_MMX -mmmx ifneq ($(CONFIG_DARWIN),yes) OP_CFLAGS+= -mpreferred-stack-boundary=2 else OP_CFLAGS+= -mpreferred-stack-boundary=4 endif ifeq ($(HAVE_GCC3_OPTIONS),yes) OP_CFLAGS+= -falign-functions=0 -fno-gcse else OP_CFLAGS+= -malign-functions=0 endif ifdef TARGET_GPROF USE_I386_LD=y endif ifdef wwCONFIG_STATIC USE_I386_LD=y endif ifdef USE_I386_LD LDFLAGS+=-Wl,-T,$(SRC_PATH)/i386.ld else # WARNING: this LDFLAGS is _very_ tricky : qemu is an ELF shared object # that the kernel ELF loader considers as an executable. I think this # is the simplest way to make it self virtualizable! LDFLAGS+=-Wl,-shared endif endif ifeq ($(ARCH),x86_64) OP_CFLAGS=$(CFLAGS) -falign-functions=0 LDFLAGS+=-Wl,-T,$(SRC_PATH)/x86_64.ld endif ifeq ($(ARCH),ppc) CFLAGS+= -D__powerpc__ OP_CFLAGS=$(CFLAGS) LDFLAGS+=-Wl,-T,$(SRC_PATH)/ppc.ld endif ifeq ($(ARCH),s390) OP_CFLAGS=$(CFLAGS) LDFLAGS+=-Wl,-T,$(SRC_PATH)/s390.ld endif ifeq ($(ARCH),sparc) ifeq ($(CONFIG_SOLARIS),yes) CFLAGS+=-mcpu=ultrasparc -m32 -ffixed-g2 -ffixed-g3 LDFLAGS+=-m32 OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -fno-omit-frame-pointer -ffixed-i0 else CFLAGS+=-m32 -ffixed-g1 -ffixed-g2 -ffixed-g3 -ffixed-g6 LDFLAGS+=-m32 OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -ffixed-i0 HELPER_CFLAGS=$(CFLAGS) -ffixed-i0 -mflat # -static is used to avoid g1/g3 usage by the dynamic linker LDFLAGS+=-Wl,-T,$(SRC_PATH)/sparc.ld -static endif endif ifeq ($(ARCH),sparc64) CFLAGS+=-m64 -ffixed-g1 -ffixed-g2 -ffixed-g3 -ffixed-g6 LDFLAGS+=-m64 OP_CFLAGS=$(CFLAGS) -fno-delayed-branch -ffixed-i0 endif ifeq ($(ARCH),alpha) # -msmall-data is not used because we want two-instruction relocations # for the constant constructions OP_CFLAGS=-Wall -O2 -g # Ensure there's only a single GP CFLAGS += -msmall-data LDFLAGS+=-Wl,-T,$(SRC_PATH)/alpha.ld endif ifeq ($(ARCH),ia64) CFLAGS += -mno-sdata OP_CFLAGS=$(CFLAGS) LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/ia64.ld endif ifeq ($(ARCH),arm) OP_CFLAGS=$(CFLAGS) -mno-sched-prolog -fno-omit-frame-pointer LDFLAGS+=-Wl,-T,$(SRC_PATH)/arm.ld endif ifeq ($(ARCH),m68k) OP_CFLAGS=$(CFLAGS) -fomit-frame-pointer LDFLAGS+=-Wl,-T,m68k.ld endif ifeq ($(HAVE_GCC3_OPTIONS),yes) # very important to generate a return at the end of every operation OP_CFLAGS+=-fno-reorder-blocks -fno-optimize-sibling-calls endif ifeq ($(CONFIG_DARWIN),yes) CFLAGS+= -I/opt/local/include LIBS+=-lmx endif ifeq ($(CONFIG_WIN32),yes) UNAME := $(shell uname -s) ifneq ($(findstring CYGWIN,$(UNAME)),) CFLAGS += -mno-cygwin -D_WIN32 LDFLAGS += -mno-cygwin -mwindows endif endif ######################################################### DEFINES+=-D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE LIBS+=-lm #now using our own zlib static version #LIBS+=-L/usr/lib -lz ifdef CONFIG_WIN32 LIBS+=-lwinmm -lws2_32 -liphlpapi endif ifdef CONFIG_SOLARIS LIBS+=-lsocket -lnsl -lresolv endif # profiling code ifdef TARGET_GPROF LDFLAGS+=-p main.o: CFLAGS+=-p endif OBJS= main.o syscall.o mmap.o signal.o path.o osdep.o thunk.o \ elfload.o linuxload.o ifdef TARGET_HAS_BFLT OBJS+= flatload.o endif ifeq ($(TARGET_ARCH), arm) OBJS+=nwfpe/fpa11.o nwfpe/fpa11_cpdo.o \ nwfpe/fpa11_cpdt.o nwfpe/fpa11_cprt.o nwfpe/fpopcode.o nwfpe/single_cpdo.o \ nwfpe/double_cpdo.o nwfpe/extended_cpdo.o arm-semi.o endif SRCS:= $(OBJS:.o=.c) OBJS+= libqemu.a # cpu emulator library LIBOBJS=exec.o kqemu.o translate-all.o translate-op.o cpu-exec.o\ translate.o ifdef CONFIG_SOFTFLOAT LIBOBJS+=fpu/softfloat.o else LIBOBJS+=fpu/softfloat-native.o endif DEFINES+=-I$(SRC_PATH)/fpu ifeq ($(TARGET_BASE_ARCH), arm) ifdef CONFIG_TRACE LIBOBJS += translate-trace.o translate-all-trace.o translate-op-trace.o endif LIBOBJS+= op_helper.o helper.o endif # NOTE: the disassembler code is only needed for debugging LIBOBJS+=disas.o ifeq ($(findstring i386, $(TARGET_ARCH) $(ARCH)),i386) USE_I386_DIS=y endif ifeq ($(findstring x86_64, $(TARGET_ARCH) $(ARCH)),x86_64) USE_I386_DIS=y endif ifdef USE_I386_DIS LIBOBJS+=i386-dis.o endif ifeq ($(findstring alpha, $(TARGET_ARCH) $(ARCH)),alpha) LIBOBJS+=alpha-dis.o endif ifeq ($(findstring ppc, $(TARGET_BASE_ARCH) $(ARCH)),ppc) LIBOBJS+=ppc-dis.o endif ifeq ($(findstring sparc, $(TARGET_BASE_ARCH) $(ARCH)),sparc) LIBOBJS+=sparc-dis.o endif ifeq ($(findstring arm, $(TARGET_ARCH) $(ARCH)),arm) LIBOBJS+=arm-dis.o endif ifeq ($(findstring m68k, $(TARGET_ARCH) $(ARCH)),m68k) LIBOBJS+=m68k-dis.o endif ifdef CONFIG_GDBSTUB OBJS+=gdbstub.o endif OBJS+=android_console.o android_modem.c sim_card.o gsm.o sysdeps_qemu.o charpipe.o modem_driver.o sms.o \ android_gps.o all: $(PROGS) ifeq ($(ARCH),alpha) # Mark as 32 bit binary, i. e. it will be mapped into the low 31 bit of # the address space (31 bit so sign extending doesn't matter) echo -ne '\001\000\000\000' | dd of=qemu bs=1 seek=48 count=4 conv=notrunc endif # must use static linking to avoid leaving stuff in virtual address space VL_OBJS=vl.o osdep.o block.o readline.o monitor.o pci.o console.o loader.o sockets.o qemu_timers.o VL_OBJS+= block-cloop.o block-dmg.o block-qcow.o aes.o ifdef CONFIG_TRACE VL_OBJS+=trace.o dcache.o varint.o endif vl.o: android.h ifdef CONFIG_SHAPER VL_OBJS+=shaper.o vl.o: shaper.h shaper.c endif ifdef CONFIG_WIN32 VL_OBJS+=tap-win32.o endif AUDIODRV = audio.o noaudio.o wavaudio.o mixeng.o ifdef CONFIG_WINAUDIO AUDIODRV += winaudio.o endif ifdef CONFIG_SDL AUDIODRV += sdlaudio.o endif ifdef CONFIG_OSS AUDIODRV += ossaudio.o endif ifdef CONFIG_COREAUDIO AUDIODRV += coreaudio.o endif ifdef CONFIG_ALSA AUDIODRV += alsaaudio.o alsaaudio.o: DEFINES := $(CONFIG_ALSA_INC) $(DEFINES) #LIBS += -lasound # we use dlopen/dlsym to get ALSA functions when available endif ifdef CONFIG_ESD AUDIODRV += esdaudio.o audio_pt_int.o esdaudio.o: DEFINES := $(CONFIG_ESD_INC) $(DEFINES) #LIBS += -lesd # we use dlopen/dlsym to get esound function, when available endif ifdef CONFIG_DSOUND AUDIODRV += dsoundaudio.o LIBS += -lole32 -ldxguid endif ifdef CONFIG_FMOD AUDIODRV += fmodaudio.o audio.o fmodaudio.o: DEFINES := -I$(CONFIG_FMOD_INC) $(DEFINES) LIBS += $(CONFIG_FMOD_LIB) endif ifdef CONFIG_ADLIB SOUND_HW += fmopl.o adlib.o endif AUDIODRV+= wavcapture.o AUDIOLIB := libqemu-audio.a $(AUDIOLIB): $(AUDIODRV) rm -f $@ $(AR) rcs $@ $(AUDIODRV) # DMA VL_OBJS+=dma.o # SCSI layer VL_OBJS+= scsi-disk.o cdrom.o # USB layer VL_OBJS+= usb.o usb-hub.o usb-linux.o usb-hid.o usb-ohci.o usb-msd.o ifeq ($(TARGET_BASE_ARCH), arm) VL_OBJS+= smc91c111.o arm_pic.o arm_boot.o VL_OBJS+= android_arm.o goldfish_device.o goldfish_interrupt.o goldfish_timer.o \ goldfish_fb.o goldfish_tty.o goldfish_switch.o goldfish_mmc.o \ goldfish_memlog.o \ goldfish_battery.o \ irq.o # platform_audio support DEFINES += -DHAS_AUDIO VL_OBJS += goldfish_audio.o ifeq ($(CONFIG_QFB), yes) VL_OBJS+= qfb_dev.o qfb_fuse.o qfb_fs.o endif ifeq ($(CONFIG_TRACE), yes) VL_OBJS+= goldfish_trace.o endif ifeq ($(CONFIG_SKINS), yes) VL_OBJS+= goldfish_events_device.o endif ifeq ($(CONFIG_NAND), yes) VL_OBJS+= goldfish_nand.o endif endif ifdef CONFIG_GDBSTUB VL_OBJS+=gdbstub.o endif VL_OBJS+=android_console.o android_modem.o sim_card.o gsm.o sysdeps_qemu.o \ charpipe.o modem_driver.o sms.o remote_call.o \ cbuffer.o \ android_gps.o VL_OBJS+=proxy_common.o proxy_http.o VL_OBJS+=android_debug.o \ android_help.o \ android_option.o \ android_utils.o \ android_resource.o \ android_config.o \ android_timezone.o \ android_events.o \ android_profile.o \ android_qemud.o \ android_kmsg.o \ skin_image.o \ skin_trackball.o \ skin_keyboard.o \ skin_file.o \ skin_window.o \ skin_scaler.o \ skin_keyset.o \ skin_rect.o \ skin_region.o \ skin_composer.o \ skin_surface.o \ framebuffer.o ifdef CONFIG_SDL ifdef CONFIG_SKINS VL_OBJS += loadpng.o android_main.o android_charmap.o else VL_OBJS+=sdl.o endif endif VL_OBJS+=vnc.o ifdef CONFIG_COCOA VL_OBJS+=cocoa.o COCOA_LIBS=-F/System/Library/Frameworks -framework Cocoa -framework IOKit endif ifdef CONFIG_COREAUDIO COCOA_LIBS+=-F/System/Library/Frameworks -framework CoreAudio endif ifdef CONFIG_SLIRP DEFINES+=-I$(SRC_PATH)/slirp SLIRP_OBJS=cksum.o if.o ip_icmp.o ip_input.o ip_output.o \ slirp.o mbuf.o misc.o sbuf.o socket.o tcp_input.o tcp_output.o \ tcp_subr.o tcp_timer.o udp.o bootp.o debug.o tftp.o VL_OBJS+=$(addprefix slirp/, $(SLIRP_OBJS)) endif VL_LDFLAGS= ifdef CONFIG_WIN32 VL_LDFLAGS+=-mno-cygwin -mwindows endif ifndef CONFIG_WIN32 ifndef CONFIG_DARWIN VL_LDFLAGS+=-lX11 endif endif android_main.c: android_utils.h android_resource.h android_config.h \ skin_image.h android_icons.h skin_file.h \ skin_window.h # specific flags are needed for non soft mmu emulator ifdef CONFIG_SKINS VL_LIBS+=$(PNG_LIBS) endif ifdef CONFIG_STATIC VL_LDFLAGS+=-static endif ifndef CONFIG_SOFTMMU VL_LDFLAGS+=-Wl,-T,$(SRC_PATH)/i386-vl.ld endif ifndef CONFIG_DARWIN ifndef CONFIG_WIN32 ifndef CONFIG_SOLARIS VL_LIBS+=-lutil -lrt endif endif endif ifdef TARGET_GPROF vl.o: CFLAGS+=-p VL_LDFLAGS+=-p endif # we need to filter out _GNU_SOURCE from the SDL C Flags if any, because # this macro is not needed at all and will break recent versions of Cygwin # with the -mno-cygwin option (blame it on Cygwin/Mingw) # SDL_CFLAGS := $(filter-out -D_GNU_SOURCE=1,$(SDL_CFLAGS)) $(info SDL_CFLAGS is $(SDL_CFLAGS)) ifdef CONFIG_DARWIN ifdef CONFIG_SDL CFLAGS += $(SDL_CFLAGS) endif endif #skin_%.o android_main.o: CFLAGS+=-O0 -g -fno-omit-frame-pointer ifeq ($(ARCH),ia64) VL_LDFLAGS+=-Wl,-G0 -Wl,-T,$(SRC_PATH)/ia64.ld endif ifdef CONFIG_WIN32 SDL_LIBS := $(filter-out -mwindows, $(SDL_LIBS)) -mconsole VL_OBJS+=android_icon.o android_icon.o: images/android_icon.rc windres $< -o $@ endif $(QEMU_SYSTEM): $(VL_OBJS) libqemu.a $(AUDIOLIB) $(LIBPNG_LIB) $(ZLIB_LIB) $(CC) $(VL_LDFLAGS) -o $@ $^ $(LIBS) $(SDL_LIBS) $(COCOA_LIBS) $(VL_LIBS) cocoa.o: cocoa.m $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< android_main.o: android_main.c android.h android_icons.h android_charmap.h android_utils.h android_resource.h skin_image.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< android_console.o: android_console.c # we need SDL_CFLAGS $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< android_resource.o: android_resource.c android_resource.h skin_default.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< skin_image.o: skin_image.c skin_image.h android_resource.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< skin_%.o: skin_%.c skin_%.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< android_charmap.o: android_charmap.c android_charmap.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< android_utils.o: android_utils.c android_utils.h $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< vnc.o: vnc.c keymaps.c sdl_keysym.h vnchextile.h $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< sdlaudio.o: sdlaudio.c $(CC) $(CFLAGS) $(DEFINES) $(SDL_CFLAGS) -c -o $@ $< esdaudio.o: esdaudio.c $(CC) $(CFLAGS) -O0 $(DEFINES) -c -o $@ $< depend: $(SRCS) $(CC) -MM $(CFLAGS) $(DEFINES) $^ 1>.depend vldepend: $(VL_OBJS:.o=.c) $(CC) -MM $(CFLAGS) $(DEFINES) $^ 1>.depend # libqemu libqemu.a: $(LIBOBJS) rm -f $@ $(AR) rcs $@ $(LIBOBJS) translate.o: translate.c gen-op.h opc.h cpu.h ifdef CONFIG_TRACE translate-trace.o: translate.c gen-op-trace.h opc-trace.h cpu.h $(CC) $(CFLAGS) $(DEFINES) -DGEN_TRACE -c -o $@ $< endif translate-all.o: translate-all.c opc.h cpu.h translate-op.o: translate-op.c op.h opc.h cpu.h op.h: op.o $(DYNGEN) $(DYNGEN) -o $@ $< opc.h: op.o $(DYNGEN) $(DYNGEN) -c -o $@ $< gen-op.h: op.o $(DYNGEN) $(DYNGEN) -g -o $@ $< op.o: op.c $(CC) $(OP_CFLAGS) $(DEFINES) -c -o $@ $< ifdef CONFIG_TRACE op-trace.h: op-trace.o $(DYNGEN) $(DYNGEN) -o $@ $< opc-trace.h: op-trace.o $(DYNGEN) $(DYNGEN) -c -o $@ $< gen-op-trace.h: op-trace.o $(DYNGEN) $(DYNGEN) -g -o $@ $< op-trace.o: op.c $(CC) $(OP_CFLAGS) $(DEFINES) -DGEN_TRACE -c -o $@ $< translate-all-trace.o: translate-all.c op-trace.h opc-trace.h cpu.h $(CC) $(OP_CFLAGS) $(DEFINES) -DGEN_TRACE -c -o $@ $< translate-op-trace.o: translate-op.c op-trace.h opc-trace.h cpu.h $(CC) $(OP_CFLAGS) $(DEFINES) -DGEN_TRACE -c -o $@ $< endif skin_scaler.o: CFLAGS += -O2 -g -fno-omit-frame-pointer helper.o: helper.c $(CC) $(HELPER_CFLAGS) $(DEFINES) -c -o $@ $< ifeq ($(TARGET_ARCH), arm) op.o: op.c op_template.h ifdef CONFIG_TRACE op-trace.o: op.c op_template.h endif endif loader.o: loader.c elf_ops.h $(OBJS) $(LIBOBJS) $(VL_OBJS): config.h ../config-host.h %.o: %.c $(CC) $(CFLAGS) $(DEFINES) -c -o $@ $< %.o: %.S $(CC) $(DEFINES) -c -o $@ $< clean: rm -f *.o *.d *.a *~ $(PROGS) gen-op.h opc.h op.h nwfpe/*.o slirp/*.o fpu/*.o ifdef CONFIG_TRACE rm -f opc-trace.h op-trace.h gen-op-trace.h endif install: all ifneq ($(PROGS),) $(INSTALL) -m 755 -s $(PROGS) "$(DESTDIR)$(bindir)" endif ifneq ($(wildcard .depend),) include .depend endif # Include automatically generated dependency files -include $(wildcard *.d)