#---------------------------------------------------------------------------------
.SUFFIXES:
#---------------------------------------------------------------------------------

ifeq ($(strip $(DEVKITPRO)),)
$(error "Please set DEVKITPRO in your environment. export DEVKITPRO=<path to>devkitPro")
endif

ifeq ($(strip $(DEVKITPPC)),)
$(error "Please set DEVKITPPC in your environment. export DEVKITPPC=<path to>devkitPPC")
endif

export PATH	:=	$(DEVKITPPC)/bin:$(PATH)

ifeq ($(PLATFORM),)
PLATFORM=wii
endif

#---------------------------------------------------------------------------------
# change shell on Snow Leopard
#---------------------------------------------------------------------------------
UNAME_S	:=	$(shell uname -s)
UNAME_R	:=	$(shell uname -r)

ifneq (,$(findstring Darwin,$(UNAME_S)))
	ifneq (,$(findstring 10.8.0,$(UNAME_R)))
		export SHELL=/bin/bash
	endif
endif

#---------------------------------------------------------------------------------
# path to tools 
#---------------------------------------------------------------------------------
export PORTLIBS	:=	$(DEVKITPRO)/portlibs/ppc
export PATH	:=	$(DEVKITPPC)/bin:$(PORTLIBS)/bin:$(PATH)

#---------------------------------------------------------------------------------
# the prefix on the compiler executables
#---------------------------------------------------------------------------------
PREFIX	:=	powerpc-eabi-

export AS	:=	$(PREFIX)as
export CC	:=	$(PREFIX)gcc
export CXX	:=	$(PREFIX)g++
export AR	:=	$(PREFIX)ar
export OBJCOPY	:=	$(PREFIX)objcopy


ISVC=$(or $(VCBUILDHELPER_COMMAND),$(MSBUILDEXTENSIONSPATH32),$(MSBUILDEXTENSIONSPATH))

#---------------------------------------------------------------------------------
%.a:
#---------------------------------------------------------------------------------
	@rm -f $@
	$(AR) -rc $@ $^

#---------------------------------------------------------------------------------
%.o: %.cpp
	$(CXX) $(CXXFLAGS) -c $< -o $@
	
#---------------------------------------------------------------------------------
%.o: %.c
	$(CC) $(CFLAGS) -c $< -o $@

#---------------------------------------------------------------------------------
%.o: %.m
	$(CC) $(OBJCFLAGS) -c $< -o $@

#---------------------------------------------------------------------------------
%.o: %.s
	$(CC) -x assembler-with-cpp $(ASFLAGS) -c $< -o $@

#---------------------------------------------------------------------------------
%.o: %.S
	$(CC) -x assembler-with-cpp $(ASFLAGS) -c $< -o $@

#---------------------------------------------------------------------------------
# canned command sequence for binary data
#---------------------------------------------------------------------------------
define bin2o
	bin2s -a 32 $< | $(AS) -o $(@)
	echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"_end[];" > `(echo $(<F) | tr . _)`.h
	echo "extern const u8" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`"[];" >> `(echo $(<F) | tr . _)`.h
	echo "extern const u32" `(echo $(<F) | sed -e 's/^\([0-9]\)/_\1/' | tr . _)`_size";" >> `(echo $(<F) | tr . _)`.h
endef

BUILD		:=	build

BUILD_LITE = 1
CURDIR   = .

export BASEDIR		:= $(CURDIR)
export DEPSDIR    := $(BASEDIR)/wii/libogc/deps
export LWIPDIR		:= $(BASEDIR)/wii/libogc/lwip
export OGCDIR		:= $(BASEDIR)/wii/libogc/libogc
export DBDIR		:= $(BASEDIR)/wii/libogc/libdb
export BTEDIR		:= $(BASEDIR)/wii/libogc/lwbt
export WIIUSEDIR	:= $(BASEDIR)/wii/libogc/wiiuse
export LIBWIIKEYB	:= $(BASEDIR)/wii/libogc/libwiikeyboard
export STUBSDIR	:= $(BASEDIR)/wii/libogc/lockstubs
export LIBS			:=	$(BASEDIR)/wii/libogc/libs

export INCDIR		:=	$(BASEDIR)/wii/libogc/include

export LIBDIR		:= $(LIBS)/$(PLATFORM)

#---------------------------------------------------------------------------------
BBALIB		:= $(LIBDIR)/libbba
OGCLIB		:= $(LIBDIR)/libogc
DBLIB			:= $(LIBDIR)/libdb
BTELIB		:= $(LIBDIR)/libbte
WIIUSELIB	:= $(LIBDIR)/libwiiuse
WIIKEYBLIB	:= $(LIBDIR)/libwiikeyboard
STUBSLIB		:= $(LIBDIR)/libgclibstubs

#---------------------------------------------------------------------------------
DEFAULTINCDIR := $(BASEDIR)/wii/libogc/include
DEFINCS		:= -I$(DEFAULTINCDIR)
INCLUDES	:=	$(DEFINCS) \
				-I$(BASEDIR)/wii/libogc \
				-I$(DEFAULTINCDIR)/netif \
				-I$(DEFAULTINCDIR)/ipv4 \
				-I$(DEFAULTINCDIR)/sdcard \
				-I$(DEFAULTINCDIR)/ogc \
				-I$(DEFAULTINCDIR)/ogc/machine \
				-I$(DEFAULTINCDIR)/bte \
				-I$(DEFAULTINCDIR)/sdcard \
				-I$(DEFAULTINCDIR)/wiikeyboard \
				-I$(DEFAULTINCDIR)/wiiuse \
				-I$(DEFAULTINCDIR)/di

MACHDEP		:= -DBIGENDIAN -DGEKKO -mcpu=750 -meabi -msdata=eabi -mhard-float -ffunction-sections -fdata-sections


ifeq ($(PLATFORM),wii)
MACHDEP		+=	-DHW_RVL
endif

ifeq ($(PLATFORM),cube)
MACHDEP		+=	-DHW_DOL
endif

CFLAGS		:= -DLIBOGC_INTERNAL -DNDEBUG -O2 -fno-strict-aliasing -mregnames -Wall $(MACHDEP) $(INCLUDES)
ASFLAGS		:=	$(MACHDEP) -mregnames -D_LANGUAGE_ASSEMBLY $(INCLUDES)

#---------------------------------------------------------------------------------
VPATH :=	$(LWIPDIR)				\
			$(LWIPDIR)/arch/gc		\
			$(LWIPDIR)/arch/gc/netif	\
			$(LWIPDIR)/core			\
			$(LWIPDIR)/core/ipv4	\
			$(LWIPDIR)/netif	\
			$(OGCDIR)			\
			$(DBDIR)			\
			$(DBDIR)/uIP		\
			$(BTEDIR)		\
			$(WIIUSEDIR)		\
			$(SDCARDDIR)			\
			$(LIBWIIKEYB)		\
			$(STUBSDIR)


#---------------------------------------------------------------------------------
SOURCES_LWIP := $(LWIPDIR)/network.c \
					 $(LWIPDIR)/netio.c \
					 $(LWIPDIR)/arch/gc/netif/gcif.c	\
					 $(LWIPDIR)/core/inet.c \
					 $(LWIPDIR)/core/mem.c \
					 $(LWIPDIR)/core/dhcp.c \
					 $(LWIPDIR)/core/raw.c	\
					 $(LWIPDIR)/core/memp.c \
					 $(LWIPDIR)/core/netif.c \
					 $(LWIPDIR)/core/pbuf.c \
					 $(LWIPDIR)/core/stats.c \
					 $(LWIPDIR)/core/sys.c \
					 $(LWIPDIR)/core/tcp.c \
					 $(LWIPDIR)/core/tcp_in.c \
					 $(LWIPDIR)/core/tcp_out.c	\
					 $(LWIPDIR)/core/udp.c \
					 $(LWIPDIR)/core/ipv4/icmp.c \
					 $(LWIPDIR)/core/ipv4/ip.c \
					 $(LWIPDIR)/core/ipv4/ip_frag.c \
					 $(LWIPDIR)/core/ipv4/ip_addr.c \
					 $(LWIPDIR)/netif/etharp.c \
					 $(LWIPDIR)/netif/loopif.c

LWIPOBJ := $(SOURCES_LWIP:.c=.o)

#---------------------------------------------------------------------------------
SOURCES_OGC		:=	\
					$(OGCDIR)/console.c \
					$(OGCDIR)/lwp_priority.c \
					$(OGCDIR)/lwp_queue.c \
					$(OGCDIR)/lwp_threadq.c \
					$(OGCDIR)/lwp_threads.c \
					$(OGCDIR)/lwp_sema.c	\
					$(OGCDIR)/lwp_messages.c \
					$(OGCDIR)/lwp.c \
					$(OGCDIR)/lwp_stack.c \
					$(OGCDIR)/lwp_mutex.c 	\
					$(OGCDIR)/lwp_watchdog.c \
					$(OGCDIR)/lwp_wkspace.c \
					$(OGCDIR)/lwp_objmgr.c \
					$(OGCDIR)/lwp_heap.c \
					$(OGCDIR)/sys_state.c \
					$(OGCDIR)/exception.c \
					$(OGCDIR)/irq.c \
					$(OGCDIR)/semaphore.c \
					$(OGCDIR)/video.c \
					$(OGCDIR)/pad.c \
					$(OGCDIR)/exi.c \
					$(OGCDIR)/mutex.c \
					$(OGCDIR)/arqueue.c \
					$(OGCDIR)/arqmgr.c	\
					$(OGCDIR)/system.c \
					$(OGCDIR)/cond.c \
					$(OGCDIR)/gx.c \
					$(OGCDIR)/gu.c \
					$(OGCDIR)/audio.c \
					$(OGCDIR)/cache.c \
					$(OGCDIR)/decrementer.c			\
					$(OGCDIR)/message.c \
					$(OGCDIR)/card.c \
					$(OGCDIR)/aram.c \
					$(OGCDIR)/depackrnc1.c \
					$(OGCDIR)/dsp.c \
					$(OGCDIR)/si.c \
					$(OGCDIR)/tpl.c \
					$(OGCDIR)/ipc.c \
					$(OGCDIR)/console_font_8x16.c \
					$(OGCDIR)/timesupp.c \
					$(OGCDIR)/lock_supp.c \
					$(OGCDIR)/newlibc.c \
					$(OGCDIR)/usbgecko.c \
					$(OGCDIR)/usbmouse.c \
					$(OGCDIR)/sbrk.c \
					$(OGCDIR)/malloc_lock.c \
					$(OGCDIR)/kprintf.c \
					$(OGCDIR)/stm.c \
					$(OGCDIR)/ios.c \
					$(OGCDIR)/es.c \
					$(OGCDIR)/isfs.c \
					$(OGCDIR)/usb.c \
					$(OGCDIR)/network_common.c \
					$(OGCDIR)/sdgecko_io.c \
					$(OGCDIR)/sdgecko_buf.c \
					$(OGCDIR)/gcsd.c \
					$(OGCDIR)/argv.c \
					$(OGCDIR)/network_wii.c \
					$(OGCDIR)/wiisd.c \
					$(OGCDIR)/conf.c \
					$(OGCDIR)/usbstorage.c \
					$(OGCDIR)/texconv.c \
					$(OGCDIR)/wiilaunch.c

SOURCES_OGC_ASM := $(OGCDIR)/cache_asm.S \
						 $(OGCDIR)/decrementer_handler.S \
						 $(OGCDIR)/depackrnc.S \
						 $(OGCDIR)/exception_handler.S \
						 $(OGCDIR)/gu_psasm.S \
						 $(OGCDIR)/irq_handler.S \
						 $(OGCDIR)/lwp_handler.S \
						 $(OGCDIR)/ogc_crt0.S \
						 $(OGCDIR)/system_asm.S \
						 $(OGCDIR)/video_asm.S


ifneq ($(BUILD_LITE), 1)
SOURCES_OGC += $(OGCDIR)/dvd.c
endif

OGCOBJ := $(SOURCES_OGC:.c=.o) $(SOURCES_OGC_ASM:.S=.o)

#---------------------------------------------------------------------------------
SOURCES_DB		:=	\
				$(DBDIR)/uIP/uip_ip.c \
				$(DBDIR)/uIP/uip_tcp.c \
				$(DBDIR)/uIP/uip_pbuf.c \
				$(DBDIR)/uIP/uip_netif.c \
				$(DBDIR)/uIP/uip_arp.c \
				$(DBDIR)/uIP/uip_arch.c \
				$(DBDIR)/uIP/uip_icmp.c \
				$(DBDIR)/uIP/memb.c \
				$(DBDIR)/uIP/memr.c \
				$(DBDIR)/uIP/bba.c \
				$(DBDIR)/tcpip.c \
				$(DBDIR)/debug.c \
				$(DBDIR)/debug_handler.c \
				$(DBDIR)/debug_supp.c \
				$(DBDIR)/geckousb.c

DBOBJ      := $(SOURCES_DB:.c=.o)

#---------------------------------------------------------------------------------
SOURCES_BTE		:=	\
					$(BTEDIR)/bte.c \
					$(BTEDIR)/hci.c \
					$(BTEDIR)/l2cap.c \
					$(BTEDIR)/btmemb.c \
					$(BTEDIR)/btmemr.c \
					$(BTEDIR)/btpbuf.c \
					$(BTEDIR)/physbusif.c

BTEOBJ      := $(SOURCES_BTE:.c=.o)

#---------------------------------------------------------------------------------
SOURCES_WIIUSE	:=	\
					$(WIIUSEDIR)/classic.c \
					$(WIIUSEDIR)/dynamics.c \
					$(WIIUSEDIR)/events.c \
					$(WIIUSEDIR)/io.c \
					$(WIIUSEDIR)/io_wii.c \
					$(WIIUSEDIR)/ir.c \
					$(WIIUSEDIR)/nunchuk.c \
					$(WIIUSEDIR)/wiiuse.c \
					$(WIIUSEDIR)/speaker.c \
					$(WIIUSEDIR)/wpad.c \
					$(WIIUSEDIR)/motion_plus.c

WIIUSEOBJ   := $(SOURCES_WIIUSE:.c=.o)

#---------------------------------------------------------------------------------
SOURCES_WIIKEYB = $(LIBWIIKEYB)/usbkeyboard.c \
						$(LIBWIIKEYB)/keyboard.c \
						$(LIBWIIKEYB)/ukbdmap.c \
						$(LIBWIIKEYB)/wskbdutil.c

WIIKEYBLIBOBJ	:=	$(SOURCES_WIIKEYB:.c=.o)

LIBRARIES	:=	$(OGCLIB).a  $(DBLIB).a

ifeq ($(PLATFORM),cube)
LIBRARIES	+=	$(BBALIB).a
endif
ifeq ($(PLATFORM),wii)
LIBRARIES	+=	$(BTELIB).a $(WIIUSELIB).a $(WIIKEYBLIB).a
endif

all: $(LIBRARIES)
#---------------------------------------------------------------------------------
$(BBALIB).a: $(LWIPOBJ)
#---------------------------------------------------------------------------------
$(OGCLIB).a: $(OGCOBJ)
#---------------------------------------------------------------------------------
$(DBLIB).a: $(DBOBJ)
#---------------------------------------------------------------------------------
$(WIIKEYBLIB).a: $(WIIKEYBLIBOBJ)
#---------------------------------------------------------------------------------
$(BTELIB).a: $(BTEOBJ)
#---------------------------------------------------------------------------------
$(WIIUSELIB).a: $(WIIUSEOBJ)
#---------------------------------------------------------------------------------

#---------------------------------------------------------------------------------
clean:
#---------------------------------------------------------------------------------
	rm -fr $(LWIPOBJ) $(OGCOBJ) $(DBOBJ) $(BTEOBJ) $(WIIUSEOBJ) $(WIIKEYBLIBOBJ)
	rm -f *.map