#---------------------------------------------------------------------------------
# Clear the implicit built in rules
#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------
ifeq ($(strip $(PSL1GHT)),)
$(error "Please set PSL1GHT in your environment. export PSL1GHT=<path>")
endif

include $(PSL1GHT)/ppu_rules
include $(PSL1GHT)/data_rules


APPEGO		:=	memdump_0.01
APPNAME		:=	MEMD
APPVERSION	:=	00001
APPPREFIX	:=	AN0001
TITLE		:=	$(APPEGO)
TITLE_ID	:=	$(APPNAME)$(APPVERSION)
APPID		:=	$(APPNAME)$(APPVERSION)
APPRAND		:=	$(shell openssl rand -hex 8 | tr [:lower:] [:upper:])
SERVICEID	:=	$(APPPREFIX)-$(APPID)_00
#CONTENTID	:=	$(SERVICEID)-$(APPRAND)
#CONTENTID	:=	$(shell [ -f $(CURDIR)/contentid ] && cat contentid || echo $(SERVICEID)-$(APPRAND))
#CONTENTID	:=	$(shell [ -f $(CURDIR)/../contentid ] && cat $(CURDIR)/../contentid || echo $(SERVICEID)-$(APPRAND))
CONTENTID	:=	$(shell [ -f $(CURDIR)/../contentid ] && cat $(CURDIR)/../contentid)

SFOXML		:=	../pkg/SFO.XML
ICON0		:=	../pkg/ICON0.PNG

#---------------------------------------------------------------------------------
# TARGET is the name of the output
# BUILD is the directory where object files & intermediate files will be placed
# SOURCES is a list of directories containing source code
# INCLUDES is a list of directories containing extra header files
#---------------------------------------------------------------------------------
TARGET		:=	$(notdir $(CURDIR))
BUILD		:=	build
SOURCES		:=	source
INCLUDES	:=	include lib
DATA		:=	data
SHADERS		:=	shaders
LIB		:=	lib

#---------------------------------------------------------------------------------
# options for code generation
#---------------------------------------------------------------------------------

CFLAGS		=	-O3 -Wall --std=gnu99 -mcpu=cell $(MACHDEP) $(LIBPATHS) $(INCLUDE) $(DEBUG) -DAPPID="$(APPID)" -mminimal-toc -maltivec -funroll-loops -ftree-vectorize
CXXFLAGS	=	$(CFLAGS)

LDFLAGS		=	$(MACHDEP) -Wl,-Map,$(notdir $@).map

#---------------------------------------------------------------------------------
# any extra libraries we wish to link with the project
#---------------------------------------------------------------------------------
VIDEOUTIL	=	-lvideoutil -lrescutil -lgcmutil -lresc -lgcm_cmd -lgcm_sys -lrsx
EVENTUTIL	=	-leventutil
IMAGEUTIL	=	-limageutil -ltilesetutil -lpngdec -ljpgdec
#FONTUTIL	=	-lfontutil -lfreetype -lz
PATCHUTIL	=	-lpatchutil -lmd5util
SYNCUTIL	=	-lsyncutil
SYSUTIL		=	-lsysutil
SYSMODULEUTIL	=	-lsysmoduleutil -lsysmodule
SYSFS		=	-laioutil -lsysfs
PADUTIL		=	-lpadutil -lio
LIBS		:=	$(VIDEOUTIL) $(IMAGEUTIL) $(FONTUTIL) $(VIDEOUTIL) $(EVENTUTIL) $(SYNCUTIL)
LIBS		+=	$(PATCHUTIL) $(SYSUTIL) $(SYSMODULEUTIL) $(SYSFS) $(SYNCUTIL) $(PADUTIL)
LIBS		+=	-lrt -llv2dbg -llv2 -lm

#---------------------------------------------------------------------------------
# list of directories containing libraries, this must be the top level containing
# include and lib
#---------------------------------------------------------------------------------
LIBDIRS		:=	$(PSL1GHT)/ppu $(PORTLIBS) $(CURDIR)

#---------------------------------------------------------------------------------
# no real need to edit anything past this point unless you need to add additional
# rules for different file extensions
#---------------------------------------------------------------------------------
ifneq ($(BUILD),$(notdir $(CURDIR)))
#---------------------------------------------------------------------------------
export OUTPUT	:=	$(CURDIR)/$(TARGET)
export VPATH	:=	$(foreach dir,$(SOURCES),$(CURDIR)/$(dir)) \
			$(foreach dir,$(DATA),$(CURDIR)/$(dir)) \
			$(foreach dir,$(SHADERS),$(CURDIR)/$(dir))
export BUILDDIR	:=	$(CURDIR)/$(BUILD)
export DEPSDIR	:=	$(BUILDDIR)

export PKGFILES	:=	$(CURDIR)/pkg/extras

#---------------------------------------------------------------------------------
# automatically build a list of object files for our project
#---------------------------------------------------------------------------------
CFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
CPPFILES	:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
sFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))
SFILES		:=	$(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.S)))
BINFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.bin)))
TTFFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.ttf)))
PNGFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.png)))
RAWFILES	:=	$(foreach dir,$(DATA),$(notdir $(wildcard $(dir)/*.raw)))
VCGFILES	:=	$(foreach dir,$(SHADERS),$(notdir $(wildcard $(dir)/*.vcg)))
FCGFILES	:=	$(foreach dir,$(SHADERS),$(notdir $(wildcard $(dir)/*.fcg)))
VPOFILES	:=	$(VCGFILES:.vcg=.vpo)
FPOFILES	:=	$(FCGFILES:.fcg=.fpo)

#---------------------------------------------------------------------------------
export OFILES	:=	$(addsuffix .o,$(BINFILES)) \
			$(addsuffix .o,$(TTFFILES)) \
			$(addsuffix .o,$(PNGFILES)) \
			$(addsuffix .o,$(RAWFILES)) \
			$(addsuffix .o,$(VPOFILES)) \
			$(addsuffix .o,$(FPOFILES)) \
			$(CFILES:.c=.o) \
			$(CPPFILES:.cpp=.o) \
			$(sFILES:.s=.o) $(SFILES:.S=.o)

#---------------------------------------------------------------------------------
# build a list of include paths
#---------------------------------------------------------------------------------
export INCLUDE	:=	$(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
			$(foreach dir,$(LIBDIRS),-I$(dir)/include) \
			$(LIBPSL1GHT_INC) \
			-I$(CURDIR)/$(BUILD)

#---------------------------------------------------------------------------------
# build a list of library paths
#---------------------------------------------------------------------------------
export LIBPATHS	:=	$(foreach dir,$(LIB),-I$(CURDIR)/$(dir)) \
			$(foreach dir,$(LIBDIRS),-L$(dir)/lib) \
			$(LIBPSL1GHT_LIB)

#---------------------------------------------------------------------------------
.PHONY: $(BUILD) clean

#---------------------------------------------------------------------------------
$(BUILD):
	@echo "building $(CONTENTID)"
	@for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET; done
	@[ -d $@ ] || mkdir -p $@
	@$(MAKE) --no-print-directory -C $(BUILDDIR) -f $(CURDIR)/Makefile
	@echo "building $(CONTENTID)"
#	@[ -n $(CONTENTID) && -f $(CURDIR)/contentid ] || echo $(CONTENTID) > $(CURDIR)/contentid

#---------------------------------------------------------------------------------
clean:
	@echo clean ...
	@for TARGET in $(TARGETS); do $(MAKE) --no-print-directory -C $$TARGET clean; done
	@rm -rf $(BUILD) $(OUTPUT).a $(OUTPUT)*.elf $(OUTPUT)*.self $(OUTPUT)*.fself $(OUTPUT)*.pkg

#---------------------------------------------------------------------------------
run:	$(OUTPUT).self
	ps3load $(OUTPUT).self

#---------------------------------------------------------------------------------
else

DEPENDS		:=	$(OFILES:.o=.d)

#---------------------------------------------------------------------------------
# main targets
#---------------------------------------------------------------------------------

#$(OUTPUT).dex.pkg:	$(OUTPUT).dex.self
#$(OUTPUT).dex.self:	$(OUTPUT).dex.elf
#$(OUTPUT).dex.elf:	$(OFILES)

$(OUTPUT).pkg:	$(OUTPUT).self
$(OUTPUT).self:	$(OUTPUT).elf
$(OUTPUT).elf:	$(OFILES)

#---------------------------------------------------------------------------------
-include $(DEPENDS)

#---------------------------------------------------------------------------------
endif
#---------------------------------------------------------------------------------

