blob: a5964b45445e9c4a19e6ca780b80ae8113eb5b64 [file] [log] [blame]
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)