CELL_SDK ?= /usr/local/cell
CELL_MK_DIR ?= $(CELL_SDK)/samples/mk
include $(CELL_MK_DIR)/sdk.makedef.mk
CELL_HOST_PATH ?= $(CELL_SDK)/host-win32
MKFSELF_NPDRM = $(CELL_HOST_PATH)/bin/make_fself_npdrm
MKPKG_NPDRM = $(CELL_HOST_PATH)/bin/make_package_npdrm

STRIP = $(CELL_HOST_PATH)/ppu/bin/ppu-lv2-strip

SNES9X_API_DIR	= ./src/snes9x
UTILS_DIR	= ./utils

PPU_SRCS		+= src/cellframework/threads/thread.cpp src/cellframework/threads/mutex.cpp src/cellframework/threads/cond.cpp src/cellframework/threads/scoped_lock.cpp src/cellframework/network/network.cpp src/emulator.cpp src/old/cellgraphicsgcm.cpp src/cellframework/utility/OSKUtil.cpp src/cellframework/graphics/PSGLGraphics.cpp src/emulator_graphics.cpp src/emulator_implementation.cpp $(SNES9X_API_DIR)/cpu.cpp $(SNES9X_API_DIR)/cpuexec.cpp $(SNES9X_API_DIR)/cpuops.cpp $(SNES9X_API_DIR)/srtc.cpp $(SNES9X_API_DIR)/dma.cpp $(SNES9X_API_DIR)/memmap.cpp $(SNES9X_API_DIR)/sa1.cpp $(SNES9X_API_DIR)/sa1cpu.cpp $(SNES9X_API_DIR)/apu/apu.cpp $(SNES9X_API_DIR)/apu/SNES_SPC.cpp $(SNES9X_API_DIR)/apu/SNES_SPC_misc.cpp $(SNES9X_API_DIR)/apu/SNES_SPC_state.cpp $(SNES9X_API_DIR)/apu/SPC_DSP.cpp $(SNES9X_API_DIR)/apu/SPC_Filter.cpp $(SNES9X_API_DIR)/fxdbg.cpp $(SNES9X_API_DIR)/fxemu.cpp $(SNES9X_API_DIR)/fxinst.cpp $(SNES9X_API_DIR)/gfx.cpp $(SNES9X_API_DIR)/ppu.cpp  $(foreach dir,$(SNES9X_API_DIR)/jma/,$(wildcard $(dir)/*.cpp)) $(foreach dir,$(SNES9x_API_DIR)/filter/,$(wildcard $(dir)/*.cpp)) $(SNES9X_API_DIR)/filter/snes_ntsc.c $(SNES9X_API_DIR)/bsx.cpp $(SNES9X_API_DIR)/c4.cpp $(SNES9X_API_DIR)/c4emu.cpp $(SNES9X_API_DIR)/cheats.cpp $(SNES9X_API_DIR)/cheats2.cpp $(SNES9X_API_DIR)/clip.cpp $(SNES9X_API_DIR)/conffile.cpp $(SNES9X_API_DIR)/controls.cpp $(SNES9X_API_DIR)/crosshairs.cpp $(SNES9X_API_DIR)/debug.cpp  $(SNES9X_API_DIR)/dsp.cpp $(SNES9X_API_DIR)/dsp1.cpp $(SNES9X_API_DIR)/dsp2.cpp $(SNES9X_API_DIR)/dsp3.cpp $(SNES9X_API_DIR)/dsp4.cpp $(SNES9X_API_DIR)/globals.cpp $(SNES9X_API_DIR)/loadzip.cpp $(SNES9X_API_DIR)/logger.cpp  $(SNES9X_API_DIR)/movie.cpp $(SNES9X_API_DIR)/netplay.cpp $(SNES9X_API_DIR)/obc1.cpp  $(SNES9X_API_DIR)/reader.cpp  $(SNES9X_API_DIR)/screenshot.cpp $(SNES9X_API_DIR)/sdd1.cpp $(SNES9X_API_DIR)/sdd1emu.cpp $(SNES9X_API_DIR)/server.cpp $(SNES9X_API_DIR)/seta.cpp $(SNES9X_API_DIR)/seta010.cpp $(SNES9X_API_DIR)/seta011.cpp $(SNES9X_API_DIR)/seta018.cpp $(SNES9X_API_DIR)/snapshot.cpp $(SNES9X_API_DIR)/snes9x.cpp $(SNES9X_API_DIR)/spc7110.cpp  $(SNES9X_API_DIR)/tile.cpp $(VPSHADER_PPU_OBJS) $(FPSHADER_PPU_OBJS) src/cellframework/input/cellInput.cpp src/menu.cpp src/cellframework/audio/resampler.cpp src/cellframework/audio/quadratic_resampler.cpp 
PPU_SRCS		+=	$(UTILS_DIR)/zlib/adler32.c $(UTILS_DIR)/zlib/compress.c $(UTILS_DIR)/zlib/crc32.c $(UTILS_DIR)/zlib/deflate.c $(UTILS_DIR)/zlib/gzclose.c $(UTILS_DIR)/zlib/gzlib.c $(UTILS_DIR)/zlib/gzread.c $(UTILS_DIR)/zlib/gzwrite.c $(UTILS_DIR)/zlib/infback.c $(UTILS_DIR)/zlib/inffast.c $(UTILS_DIR)/zlib/inflate.c $(UTILS_DIR)/zlib/inftrees.c $(UTILS_DIR)/zlib/trees.c $(UTILS_DIR)/zlib/uncompr.c $(UTILS_DIR)/zlib/zutil.c $(UTILS_DIR)/zlib/contrib/minizip/ioapi.c $(UTILS_DIR)/zlib/contrib/minizip/mztools.c  $(UTILS_DIR)/zlib/contrib/minizip/zip.c $(UTILS_DIR)/zlib/contrib/minizip/unzip.c
PPU_SRCS		+=	src/cellframework/audio/librsound.c src/cellframework/audio/buffer.c
PPU_TARGET		=	snes9x.ppu.elf

# debugging
#PPU_CFLAGS += -DEMUDEBUG
#PPU_CXXFLAGS += -DEMUDEBUG

#for libGCM
#PPU_CFLAGS	+=	-I. -DUSE_FILE32API -Dunix -DPS3_SDK_3_41 -funroll-loops
#PPU_CXXFLAGS	+=	-I./snes9x/ -DZLIB -DUNZIP_SUPPORT -DCPU_SHUTDOWN -DJMA_SUPPORT -DPS3_SDK_3_41 -funroll-loops
#PPU_LDLIBS		+= 	-L. -ldbgfont_gcm -lgcm_cmd -lgcm_sys_stub -lm -lio_stub -lfs_stub -lsysutil_stub -lsysmodule_stub  -laudio_stub

#for PSGL
PPU_CFLAGS	+=	-I. -DUSE_FILE32API -Dunix -funroll-loops -DPS3_SDK_3_41 -DPSGL -mcpu=cell
PPU_CXXFLAGS	+=	-I./src/ -I./src/snes9x/ -DZLIB -DPS3_SDK_3_41 -DUNZIP_SUPPORT -DJMA_SUPPORT -DPSGL -funroll-loops -mcpu=cell
PPU_LDLIBS		+= 	-L. -L$(CELL_SDK)/target/ppu/lib/PSGL/RSX/opt -ldbgfont -lPSGL -lgcm_cmd -lgcm_sys_stub -lresc_stub -lm -lio_stub -lfs_stub -lsysutil_stub -lsysmodule_stub -laudio_stub -lpthread -lnet_stub

VPSHADER_SRCS	=	shaders/vpshader.cg
FPSHADER_SRCS	=	shaders/fpshader.cg

VPSHADER_PPU_OBJS = $(patsubst %.cg, $(OBJS_DIR)/%.ppu.o, $(VPSHADER_SRCS))
FPSHADER_PPU_OBJS = $(patsubst %.cg, $(OBJS_DIR)/%.ppu.o, $(FPSHADER_SRCS))

include $(CELL_MK_DIR)/sdk.target.mk

PPU_OBJS += $(VPSHADER_PPU_OBJS) $(FPSHADER_PPU_OBJS)

$(VPSHADER_PPU_OBJS): $(OBJS_DIR)/%.ppu.o : %.vpo
	@mkdir -p $(dir $(@))
	$(PPU_OBJCOPY)  -I binary -O elf64-powerpc-celloslv2 -B powerpc $< $@

$(FPSHADER_PPU_OBJS): $(OBJS_DIR)/%.ppu.o : %.fpo
	@mkdir -p $(dir $(@))
	$(PPU_OBJCOPY)  -I binary -O elf64-powerpc-celloslv2 -B powerpc $< $@

.PHONY: pkg
pkg: $(PPU_TARGET) 
	$(STRIP) $(PPU_TARGET)
	$(MKFSELF_NPDRM) $(PPU_TARGET) pkg/USRDIR/EBOOT.BIN
	$(MKPKG_NPDRM) pkg/package.conf pkg




