# Generated automatically from Makefile.in by configure.
#ZSNESFX=1
#ZSNESC4=1
#ASMCPU=1
#SPC700ASM=1
#NETPLAY=1
##UNZIP=1
#JMA=1
#GLIDE=1
#OPENGL=1
#AIDO=1
#GUI=0
#THREAD_SOUND=1
#ASMKREED=1
SDD1_DECOMP=1
#SDD1_VERIFY=0
#DREAMCAST=1
#CHEATS=1
#2XSAI=1
PSP=1
OPTI=1
OPTITEST=1
#USE_PROFILER=1
#UBER_OPTIMIZE=1
LOGGED_BUILD=1

#Fairly good and special-char-safe descriptor of the os being built on.
OS=`uname -s -r -m|sed \"s/ /-/g\"|tr \"[A-Z]\" \"[a-z]\"|tr \"/()\" \"___\"`
BUILDDIR=.
#BUILDDIR=build/$(OS)
VPATH = .
srcdir = .
prefix = /usr/local
exec_prefix = ${prefix}

ifdef DREAMCAST
CPU=sh
ASMCPU=1
CHEATS=0
2XSAI=0
else
CPU=i386
endif

ifdef ZSNESFX
FXOBJ=$(CPU)/fxemu2b.o $(CPU)/fxemu2.o $(CPU)/fxemu2c.o $(CPU)/fxtable.o $(CPU)/sfxproc.o $(CPU)/ZSNES.O
FXDEFINES=-DZSNES_FX -DEXECUTE_SUPERFX_PER_LINE
FXDEPENDS=zsnes_fx
FXNO_DEPENDS=c_fx
else
FXOBJ=fxinst.o fxemu.o fxdbg.o
FXDEFINES=-DEXECUTE_SUPERFX_PER_LINE
FXDEPENDS=c_fx
FXNO_DEPENDS=zsnes_fx
endif

ifdef ZSNESC4
C4OBJ=$(CPU)/C4.O $(CPU)/zsnesc4.o c4.o
C4DEFINES=-DZSNES_C4
C4DEPENDS=zsnes_c4
C4NO_DEPENDS=c_c4
else
C4OBJ=c4.o c4emu.o
C4DEFINES=
C4DEPENDS=c_c4
C4NO_DEPENDS=zsnes_c4
endif

ifdef SPC700ASM
SOUNDOBJ=spctool/spc700.o spctool/dsp.o spctool.o spctool/soundmod.o 
SOUNDDEFINES=-DSPCTOOL
else
SOUNDOBJ=spc700.o soundux.o apu.o 
SOUNDDEFINES=-DSPC700_C
endif

ifdef ASMCPU
CPUOBJ=$(CPU)/cpuops.o $(CPU)/cpuexec.o $(CPU)/sa1ops.o
else
CPUOBJ=cpuops.o cpuexec.o sa1cpu.o
endif

ifdef DREAMCAST
	PLATFORMOBJ=dc/input.o dc/display.o dc/sound.o \
	dc/dc.o dc/menu.o dc/trace.o dc/lcd.o \
	dc/lain_blanker.o dc/td.o dc/md5.o
else
	PLATFORMOBJ=unix/unix.o unix/config.o
endif

ifdef CHEATS
	CHEATOBJ=cheats.o cheats2.o
endif

ifndef DREAMCAST
	SNAPOBJ = snaporig.o snapshot.o
	SCREENSHOTOBJ = screenshot.o
	MOVIEOBJ = movie.o
endif

ifdef 2XSAI
ifdef ASMKREED
KREEDOBJ=$(CPU)/2XSAIMMX.O $(CPU)/bilinear.o 2xsai.o
KREEDDEFINES=-DMMX
else
KREEDOBJ=2xsai.o
endif
endif

ifdef SDD1_DECOMP
SDD1OBJ=sdd1emu.o
ifdef SDD1_VERIFY
SDD1DEFINES=-DSDD1_DECOMP -DSDD1_VERIFY
else
SDD1DEFINES=-DSDD1_DECOMP
endif
endif

SPC7110OBJ=spc7110.o
OBC1OBJ=obc1.o
SETAOBJ=seta.o seta010.o seta011.o seta018.o

ifdef PSP
C4OBJ=c4.o c4emu.o
OBJECTS=$(CPUOBJ) $(SOUNDOBJ) $(FXOBJ) $(C4OBJ) \
	cpu.o sa1.o sdd1.o debug.o srtc.o tile.o gfx.o memmap.o clip.o \
	dsp1.o ppu.o dma.o data.o globals.o \
	$(SPC7110OBJ) $(OBC1OBJ) $(SETAOBJ) $(KREEDOBJ) $(SDD1OBJ) \
	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ)
else
OBJECTS=$(CPUOBJ) $(SOUNDOBJ) $(FXOBJ) $(C4OBJ) \
	cpu.o sa1.o debug.o sdd1.o tile.o srtc.o gfx.o memmap.o clip.o \
	dsp1.o ppu.o dma.o snes9x.o data.o globals.o \
	$(SPC7110OBJ) $(OBC1OBJ) $(SETAOBJ) $(KREEDOBJ) $(SDD1OBJ) \
	$(CHEATOBJ) $(PLATFORMOBJ) $(SNAPOBJ) $(SCREENSHOTOBJ) $(MOVIEOBJ)
endif

ifdef NETPLAY
OBJECTS += netplay.o server.o
NETPLAYDEFINES=-DNETPLAY_SUPPORT
SERVER_OBJECTS=server.o
endif

ifdef UNZIP
ZLIB_OBJECTS := zlib/crc32.o zlib/inflate.o zlib/zutil.o zlib/infblock.o zlib/infcodes.o \
	zlib/inffast.o zlib/inftrees.o zlib/infutil.o zlib/adler32.o
UNZIP_OBJECTS += loadzip.o unzip/unzip.o unzip/explode.o unzip/unreduce.o unzip/unshrink.o $(ZLIB_OBJECTS)
UNZIPDEFINES=-DUNZIP_SUPPORT
endif

ifdef JMA
OBJECTS += jma/s9x-jma.o jma/7zlzma.o jma/crc32.o jma/iiostrm.o jma/inbyte.o\
	   jma/jma.o jma/lzma.o jma/lzmadec.o jma/winout.o
JMADEFINES=-DJMA_SUPPORT -fexceptions
endif

ifdef THREAD_SOUND
CPUDEFINES += -DUSE_THREADS
EXTRALIBS += -lpthread
endif

ifdef GLIDE
GLIDEOBJS = unix/glide.o
GLIDEDEFINES = -DUSE_GLIDE -I/usr/include/glide
GLIDELIBS = -lglide2x
endif

ifdef OPENGL
OPENGLOBJS = unix/opengl.o
OPENGLDEFINES = -DUSE_OPENGL
OPENGLLIBS = -lGL -lGLU -ldl
endif

ifdef AIDO
AIDOOBJS = unix/aido.o
AIDODEFINES = -DUSE_AIDO
endif

JOYDEFINES = 

ifdef DREAMCAST
CXX = sh-elf-c++ -fno-rtti
CC = sh-elf-gcc
NASM = fail
GASM = fail
else
CXX = c++  -fno-rtti
CC = gcc
NASM = not_found
GASM = c++
endif

ifdef DREAMCAST
INCLUDES = -I$(srcdir)/dc
DEFS = -DDC
else
INCLUDES = -INONE
DEFS = -DMITSHM
endif

#INCLUDES += -I$(srcdir) -I$(srcdir)/unzip 
INCLUDES += -I$(srcdir)

ifdef DREAMCAST
OPTIMISE=-O4 -ffreestanding -ffast-math -fschedule-insns2 -fomit-frame-pointer -fno-inline-functions -fno-defer-pop -fforce-addr -fstrict-aliasing -funroll-loops -fdelete-null-pointer-checks -fno-exceptions
CPUFLAGS=-ml  -m4-single-only
else
#OPTIMISE =  -O2 -fomit-frame-pointer -fno-exceptions -Wall -W -pedantic -Wno-unused-parameter -pipe
OPTIMISE=-O4 -ffreestanding -ffast-math -fschedule-insns2 -fomit-frame-pointer -fno-inline-functions -fno-defer-pop -fforce-addr -fstrict-aliasing -funroll-loops -fdelete-null-pointer-checks -fno-exceptions
endif

ifdef PSP
CXX  = psp-g++
CC   = psp-gcc
NASM = fail
GASM = fail
INCLUDES += -I$(srcdir)/psp  -I`psp-config -p`/include
DEFS      = -DPSP -DPSP_NOTUSE -DUSE_SCEGU
ifdef OPTI
DEFS     += -DOPTI
endif
CPUFLAGS = -mno-fp-exceptions -mno-check-zero-division
OPTIMISE = -O3 -ffast-math -floop-optimize2 -fbranch-target-load-optimize2 \
	 -ftree-vectorize -fno-inline-functions -fforce-addr \
	 -funroll-loops
ifndef DEBUG
OPTIMISE += -fomit-frame-pointer
endif

ifdef UBER_OPTIMIZE
OPTIMISE += -Wdisabled-optimization -Wextra -Wstrict-aliasing=2 #-Wcast-align
OPTIMISE += -Wpacked -Wpadded #-Wunreachable-code
endif
	 
OPTIMISE_C= $(OPTIMISE)
OPTIMISE_CXX=-fno-exceptions -fno-rtti $(OPTIMISE)


ifdef CPU_OPTI
PSP_OBJECTS=globals.o cpuexec.o sa1cpu.o spc700.o soundux.o apu.o fxinst.o fxemu.o c4.o c4emu.o cpu.o sa1.o tile.o srtc.o gfx.o memmap.o clip.o dsp1.o ppu.o dma.o data.o obc1.o sdd1.o sdd1emu.o psp/config.o psp/psp.o psp/pg.o psp/filer.o snapshot.o $(UNZIP_OBJECTS)
else
PSP_OBJECTS=$(OBJECTS) $(UNZIP_OBJECTS)
endif

PLATFORMOBJ   = psp/psp.o psp/config.o psp/pg.o psp/filer.o psp/scegu.o
SNAPOBJ       = snapshot.o
SCREENSHOTOBJ =
MOVIEOBJ      =

# Allow Yoshi's Island to run (even though it runs REALLY slow)
DEFS     += -DDETECT_NASTY_FX_INTERLEAVE
endif

DEFS += \
-DCPU_SHUTDOWN \
-DSPC700_SHUTDOWN \
$(FXDEFINES) \
$(C4DEFINES) \
$(CPUDEFINES) \
$(SOUNDDEFINES) \
$(NETPLAYDEFINES) \
$(UNZIPDEFINES) \
$(JMADEFINES) \
$(GLIDEDEFINES) \
$(OPENGLDEFINES) \
$(AIDODEFINES) \
$(KREEDDEFINES) \
$(SDD1DEFINES) \
$(JOYDEFINES) \
-DNO_INLINE_SET_GET -DNOASM
#-DNO_INLINE_SET_GET  -DNOASM '-DACCEPT_SIZE_T=socklen_t'
#-DNO_INLINE_SET_GET  -DNOASM '-DACCEPT_SIZE_T=socklen_t' -DNOSOUND

#-DNO_INLINE_SET_GET  -DNOASM -DHAVE_STRINGS_H '-DACCEPT_SIZE_T=socklen_t' -DNOSOUND

#-DOLD_COLOUR_BLENDING
#-DSOUND
#-DDEBUGGER
#-DNO_INLINE_SET_GET
#-DVAR_CYCLES
#-DCPU_SHUTDOWN
#-DSPC700_SHUTDOWN

CFLAGS = $(OPTIMISE_C) $(CPUFLAGS) $(INCLUDES) $(DEFS)
CXXFLAGS = $(OPTIMISE_CXX) $(CPUFLAGS) $(INCLUDES) $(DEFS)


ifdef USE_PROFILER
DEFS += -DUSE_PROFILER -DPROFILE_TILES -DPROFILE_GFX
#DEFS += -DUSE_PROFILER -DPROFILE_HW
endif

.SUFFIXES: .log .o .cpp .c .cc .h .m .i .S .asm .obj .O .CPP .C .ASM
#FIXME: Why is this set statically?
#LDLIBS = -L/usr/X11R6/lib
# -L../zlib
LDLIBS =  psp/unziplib.a -L`psp-config -p`/lib \
	  -lpspaudio -lpspctrl -lpsppower -lpspdebug -lpspgu -lpspge -lpspdisplay \
	  -lpsplibc -lpspuser -lpspkernel -lm #-lz
	  

ifdef PROFILE
#LDLIBS += -lgcov
endif

ifdef GLIDE
SNES9XBIN=gsnes9x
else
ifdef OPENGL
SNES9XBIN=osnes9x
else
SNES9XBIN=snes9x
endif
endif

ifdef LOGGED_BUILD
ECHO=echo
TAIL=tail

TAIL_LOG=$(TAIL)

LOG_COMPILE=>> $(COMPILE_LOG) 2>&1
LOG_COMPILE_EXECUTE=$(LOG_COMPILE)         && exit 0 || \
	    	$(TAIL_LOG) $(COMPILE_LOG) &&           \
		echo -e "\n\n *** See $(COMPILE_LOG) for more details... ***\n" && \
		exit 1
LOG_LINK=>> $(LINK_LOG) 2>&1
LOG_LINK_EXECUTE=$(LOG_LINK)            && exit 0 || \
	 	$(TAIL_LOG) $(LINK_LOG) &&           \
		echo -e "\n\n *** See $(LINK_LOG) for more details... ***\n" && \
		exit 1

COMPILE_LOG=compile.log
LINK_LOG=link.log

LOG_FILES=$(COMPILE_LOG) $(LINK_LOG)
endif


all: $(LOG_FILES) $(SNES9XBIN) EBOOT.PBP

#Makefile.psp: configure Makefile.in
#	@echo "Makefile is older than configure or in-file. Run configure or touch Makefile."
#	exit 1

#configure: configure.in
#	@echo "configure is older than in-file. Run autoconf or touch configure."
#	exit 1

#ggisnes9x

kxploit: all
	kxploit EBOOT.PBP SNES9X /mnt/PSP/PSP/GAME
	
#FIXME: Make this more portable and add install.sh, maybe add strip
install: all
	install -D $(SNES9XBIN) "$(exec_prefix)/bin/$(SNES9XBIN)"

directories:
	@test -d $(CPU) || mkdir $(CPU)
	@test -d unix || mkdir unix
	@test -d unzip || mkdir unzip
	@test -d jma || mkdir jma

snes9x: $(PSP_OBJECTS)
	psp-gcc -o $@ $(PSP_OBJECTS) $(LDLIBS) $(EXTRALIBS)

EBOOT.PBP: $(SNES9XBIN) PARAM.SFO
	psp-strip $(SNES9XBIN) -o $(SNES9XBIN)_stripped
	pack-pbp $@ PARAM.SFO ICON0.PNG NULL NULL NULL NULL $(SNES9XBIN)_stripped NULL
	-rm -f $(SNES9XBIN)_stripped

PARAM.SFO:
	mksfo "uo_Snes9x 0.02pd2" $@

#snes9x: $(OBJECTS) unix/x11.o $(AIDOOBJS)
#	$(CXX) $(INCLUDES) -o $@ $(OBJECTS) $(AIDOOBJS) $(GLIDEOBJS) $(OPENGLOBJS) unix/x11.o $(LDLIBS) $(GLIDELIBS) $(OPENGLLIBS)   -lXext -lX11 $(EXTRALIBS) -lm

ssnes9x: $(OBJECTS) unix/svga.o 
	$(CXX) $(INCLUDES) -o $@ $(OBJECTS) $(GLIDEOBJS) unix/svga.o $(LDLIBS) $(GLIDELIBS)   -lvga -lvgagl $(EXTRALIBS) -lm

gsnes9x: $(OBJECTS) $(GLIDEOBJS)
	$(CXX) $(INCLUDES) -o $@ $(OBJECTS) $(GLIDEOBJS) $(LDLIBS)   -lglide $(EXTRALIBS) -lm

ggisnes9x: $(OBJECTS) unix/ggi.o
	$(CXX) $(INCLUDES) -o $@ $(OBJECTS) unix/ggi.o $(LDLIBS)   -lggi $(EXTRALIBS) -lm

osnes9x: $(OBJECTS) unix/x11.o $(OPENGLOBJS)
	$(CXX) $(INCLUDES) -o $@ $(OBJECTS) unix/x11.o $(OPENGLOBJS) $(LDLIBS) $(OPENGLLIBS)   -lXext -lX11 $(EXTRALIBS) -lm

s9xserver: $(SERVER_OBJECTS)
	$(CXX) $(INCLUDES) -o $@ $(SERVER_OBJECTS)


$(LOG_FILES):
	@rm -f $(LOG_FILES)


.cpp.o:
ifdef LOGGED_BUILD
	@$(ECHO) -e "--------------------------------------------------------------------------------\n" $(LOG_COMPILE)
	@$(ECHO) -e " *** $< *** \n\n"                          $(LOG_COMPILE)
	@$(ECHO) -e "  [$(CXX) $(INCLUDES) -c $(CXXFLAGS) $(srcdir)/$*.cpp -o $@]\n\n"  $(LOG_COMPILE)
	@$(ECHO) " CXX    $<"; $(CXX) $(INCLUDES) -c $(CXXFLAGS) $(srcdir)/$*.cpp -o $@ $(LOG_COMPILE_EXECUTE)
	@$(ECHO) -e "\n\n *** $< *** \n"                        $(LOG_COMPILE)
	@$(ECHO) -e "--------------------------------------------------------------------------------\n" $(LOG_COMPILE)
else
	$(CXX) $(INCLUDES) -c $(CXXFLAGS) $(srcdir)/$*.cpp -o $@
endif

.c.o:
ifdef LOGGED_BUILD
	@$(ECHO) -e "--------------------------------------------------------------------------------\n" $(LOG_COMPILE)
	@$(ECHO) -e " *** $< *** \n\n"                          $(LOG_COMPILE)
	@$(ECHO) -e "  [$(CC) $(INCLUDES) -c $(CFLAGS) $(srcdir)/$*.c -o $@]\n\n"  $(LOG_COMPILE)
	@$(ECHO) " CC    $<"; $(CC) $(INCLUDES) -c $(CFLAGS) $(srcdir)/$*.c -o $@ $(LOG_COMPILE_EXECUTE)
	@$(ECHO) -e "\n\n *** $< *** \n"                        $(LOG_COMPILE)
	@$(ECHO) -e "--------------------------------------------------------------------------------\n" $(LOG_COMPILE)
else
	$(CC) $(INCLUDES) -c $(CFLAGS) $(srcdir)/$*.c -o $@
endif

.cpp.S:
	$(GASM) $(INCLUDES) -S $(CXXFLAGS) $(srcdir)/$*.cpp -o $@

.cpp.i:
	$(GASM) $(INCLUDES) -E $(CXXFLAGS) $(srcdir)/$*.cpp -o $@

.S.o:
	$(GASM) $(INCLUDES) -c $(CFLAGS) $(srcdir)/$*.S -o $@

.S.i:
	$(GASM) $(INCLUDES) -c -E $(CFLAGS) $(srcdir)/$*.S -o $@

#.s.o:
#	@echo Compiling $*.s
#	sh-elf-as -little $(srcdir)/$*.s -o $@

.s.o:
	@echo Compiling $*.s
	ee-gcc $(srcdir)/$*.s -march=r4000 -mgp32 -c -xassembler -O -o $@

.asm.o:
	$(NASM) -f elf $(FXDEFINES) -I$(srcdir)/ -I$(srcdir)/$(CPU)/ -o $@ $(srcdir)/$*.asm

.obj.o:
	cp $*.obj $*.o

.CPP.O:
	$(CXX) $(INCLUDES) -c $(CXXFLAGS) -x c++ $(srcdir)/$*.CPP -o $@

.C.O:
	$(CC) $(INCLUDES) -c $(CFLAGS) $(srcdir)/$*.C -o $@

.ASM.O:
	$(NASM) -f elf $(FXDEFINES) -I$(srcdir)/ -I$(srcdir)/$(CPU)/ $(srcdir)/$*.ASM -o $@

unix/moc_snes9x_gui.cpp: unix/snes9x_gui.h
	$(MOC) unix/snes9x_gui.h -o $@

clean:
	-rm -f $(SNES9XBIN) EBOOT.PBP PARAM.SFO $(OBJECTS) $(CPU)/offsets.h offsets.o unix/svga.o unix/aido.o unix/x11.o unix/ggi.o unix/xf86.o unix/glide.o $(UNZIP_OBJECTS) $(LOG_FILES)

#release: CFLAGS += -DNO_DEBUGGER

_bin-package:
	RELNR=`grep "#define VERSION" snes9x.h | sed -e 's/"//g' | awk '{ print $$3 }'` && \
	echo $$RELNR && \
	RELNAME=snes9x-$${RELNR} && export RELNAME && \
	test \! -f $${RELNAME}.tar.gz && \
	DISTDIR=disttmp/$${RELNAME}/ && \
	rm -rf disttmp && \
	mkdir disttmp && \
	mkdir $${DISTDIR} && \
	cp snes9x $${DISTDIR} && \
	cp config.info hardware.txt problems.txt changes.txt ../faqs.txt ../readme.txt ../readme.unix $${DISTDIR} && \
	(cd disttmp && tar cvf - $${RELNAME}) | gzip -c > $${RELNAME}.tar.gz &&\
	rm -rf disttmp

#FIXME: Should possibly have clean, but not in xenofarm build
bin-release: snes9x _bin-package

#FIXME: Intelligent messages when bailing out.
#FIXME: See those ls:s? Don't look to closely at the statements...
_src-package:
	RELNR=`grep "#define VERSION" snes9x.h | sed -e 's/"//g' | awk '{ print $$3 }'` && \
	echo $$RELNR && \
	RELNAME=snes9x-$${RELNR}-src && \
	test \! -f $${RELNAME}.tar.gz && \
	test \! `ls *~` && \
	test \! `ls *.o` && \
	test \! -f snes9x && \
	export RELNR && export RELNAME && \
	(cd .. && PWD=`pwd` && SNESDIR=`basename $$PWD` && cd .. && \
	 DISTDIR=disttmp/$${RELNAME} && \
	 rm -rf disttmp && \
	 mkdir disttmp && \
	 cp -r $${SNESDIR} $${DISTDIR} && \
	 rm -f $${DISTDIR}/snes9x/config.* 2>/dev/null && \
	 rm -f $${DISTDIR}/snes9x/conftezt.out.* 2>/dev/null && \
	 rm -rf $${DISTDIR}/snes9x/autom4te.cache 2>/dev/null && \
	 rm $${DISTDIR}/snes9x/Makefile && \
	 find disttmp -name CVS -type f -exec rm "{}" \; && \
	 find disttmp -name CVS -type d -exec rm "{}" \; && \
	 (cd disttmp && tar cvf - $${RELNAME}) | gzip -c > $${RELNAME}.tar.gz  && \
	mv $${RELNAME}.tar.gz $${SNESDIR}/snes9x/ ) && \
	rm -rf disttmp

#Requires:
# 1. Prestine checkout
# 2. `autoconf`
# 3. `./configure`
src-release: depend _src-package

xenofarm:
	./xenofarm.sh
	cd build/xenofarm && tar cf - . > ../../../xenofarm_result.tar
	gzip -f9 ../xenofarm_result.tar

# And now for the impressive testsuite:
verify: snes9x
	./snes9x --selftest

#FIXME: Make a auto-self-reference.
dependencies:
	@echo "Calculating dependencies..."
	@$(CXX) $(CXXFLAGS) -MM -MG \
	  `find . '(' -name '*.c' -o -name '*.cpp' -o -name '*.S' ')' -print -o -name msdos -prune` \
	  | sed -e 's@^[^ :]*: *\([^ ]*/\)[^ /]*@\1&@' \
	  >dependencies

#NOTE: Not VPATH safe
TAGS: *.c *.h psp/*.c psp/*.h psp/*.cpp unzip/*.c unzip/*.h 
	-etags *.c *.h psp/*.c psp/*.h psp/*.cpp unzip/*.c unzip/*.h

-include dependencies