#Makefile MUPEN64 for glN64 + MenuV2 + Wii 

CC		=powerpc-eabi-gcc
CXX		=powerpc-eabi-g++
AS		=powerpc-eabi-as

CFLAGS  = -pipe -Ofast -Wall -Wno-multichar -mrvl -fgnu89-inline -flto=jobserver \
	  -DWII -DRELEASE -DMENU_V2 -DGLN64_GX -DUSE_EXPANSION \
	  -DPPC_DYNAREC -DUSE_RECOMP_CACHE -DFASTMEM -DNDEBUG

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

CXXFLAGS=$(CFLAGS)

OBJ		=main/rom_gc.o \
		main/main_gc-menu2.o \
		main/gc_dvd.o \
		main/ROM-Cache-MEM2.o \
		main/gczip.o \
		main/timers.o \
		menu/MenuContext.o \
		menu/MainFrame.o \
		menu/LoadRomFrame.o \
		menu/FileBrowserFrame.o \
		menu/ConfigureButtonsFrame.o\
		menu/ConfigureInputFrame.o\
		menu/ConfigurePaksFrame.o\
		menu/CurrentRomFrame.o \
		menu/SettingsFrame.o\
		menu/MenuResources.o \
		libgui/Button.o \
		libgui/Component.o \
		libgui/CursorManager.o \
		libgui/FocusManager.o \
		libgui/Frame.o \
		libgui/GraphicsGX.o \
		libgui/Gui.o \
		libgui/GuiResources.o \
		libgui/Image.o \
		libgui/InputManager.o \
		libgui/InputStatusBar.o \
		libgui/IPLFont.o \
		libgui/LoadingBar.o \
		libgui/Logo.o \
		libgui/MessageBox.o \
		libgui/resources.o \
		libgui/TextBox.o \
		fileBrowser/fileBrowser-SMB.o \
		fileBrowser/fileBrowser-DVD.o \
		fileBrowser/fileBrowser-CARD.o \
		fileBrowser/fileBrowser-libfat.o \
		fileBrowser/fileBrowser.o \
		gui/GUI.o \
		gui/DEBUG.o \
		gui/TEXT.o \
		r4300/r4300.o \
		r4300/cop0.o \
		r4300/special.o \
		r4300/regimm.o \
		r4300/exception.o \
		r4300/Invalid_Code.o \
		r4300/ARAM-blocks.o \
		r4300/Recomp-Cache-Heap.o \
		gc_memory/tlb.o \
		gc_memory/TLB-Cache-hash.o \
		gc_memory/memory.o \
		gc_memory/dma.o \
		r4300/interupt.o \
		r4300/cop1.o \
		r4300/tlb.o \
		r4300/cop1_w.o \
		r4300/cop1_s.o \
		r4300/cop1_d.o \
		r4300/recomp.o \
		gc_memory/n64_cic_nus_6105.o \
		gc_memory/pif.o \
		r4300/bc.o \
		r4300/cop1_l.o \
		r4300/pure_interp.o \
		r4300/compare_core.o \
		gc_memory/flashram.o \
		main/md5.o \
		main/savestates_gc.o \
		r4300/profile.o \
		main/ata.o \
		main/dsi_handler.o \
		main/wii_vm.o \

OBJ_PPC		=r4300/ppc/MIPS-to-PPC.o \
		r4300/ppc/Recompile.o \
		r4300/ppc/Wrappers.o \
		r4300/ppc/FuncTree.o \
		r4300/ppc/Register-Cache.o

OBJ_INPUT	=gc_input/main.o \
		gc_input/controller-GC.o \
		gc_input/controller-Extenmote.o \
		gc_input/controller-Classic.o \
		gc_input/controller-WiimoteNunchuk.o

OBJ_RSPHLE	=rsp_hle/alist.o \
		rsp_hle/alist_audio.o \
		rsp_hle/alist_naudio.o \
		rsp_hle/alist_nead.o \
		rsp_hle/audio.o \
		rsp_hle/cicx105.o \
		rsp_hle/hle.o \
		rsp_hle/hvqm.o \
		rsp_hle/jpeg.o \
		rsp_hle/memory.o \
		rsp_hle/mp3.o \
		rsp_hle/musyx.o \
		rsp_hle/re2.o \
		rsp_hle/plugin.o

OBJ_RSPHLEPPC	=rsp_hle-ppc/main.o \
		rsp_hle-ppc/jpeg.o \
		rsp_hle-ppc/ucode3.o \
		rsp_hle-ppc/ucode2.o \
		rsp_hle-ppc/ucode1.o

OBJ_AUDIO	=gc_audio/main.o

OBJ_GLN64_GX	=glN64_GX/glN64.o \
		glN64_GX/Config_linux.o \
		glN64_GX/OpenGL.o \
		glN64_GX/N64.o \
		glN64_GX/RSP.o \
		glN64_GX/VI.o \
		glN64_GX/Textures.o \
		glN64_GX/FrameBuffer.o \
		glN64_GX/Combiner.o \
		glN64_GX/gDP.o \
		glN64_GX/gSP.o \
		glN64_GX/GBI.o \
		glN64_GX/DepthBuffer.o \
		glN64_GX/CRC.o \
		glN64_GX/2xSAI.o \
		glN64_GX/TEV_combiner.o \
		glN64_GX/RDP.o \
		glN64_GX/F3D.o \
		glN64_GX/F3DEX.o \
		glN64_GX/F3DEX2.o \
		glN64_GX/L3D.o \
		glN64_GX/L3DEX.o \
		glN64_GX/L3DEX2.o \
		glN64_GX/S2DEX.o \
		glN64_GX/S2DEX2.o \
		glN64_GX/F3DPD.o \
		glN64_GX/F3DDKR.o \
		glN64_GX/F3DWRUS.o \
		glN64_GX/F3DCBFD.o

HEADER		=main/rom.h \
		r4300/r4300.h \
		r4300/ops.h \
		r4300/macros.h \
		r4300/exception.h \
		gc_memory/memory.h \
		gc_memory/tlb.h \
		gc_memory/dma.h \
		r4300/interupt.h \
		r4300/recomp.h \
		gc_memory/pif.h

LIB		=	-laesnd -lwiiuse -lbte -ltinysmb -lfat -lz -static

ifeq ($(strip mupen64_GX_gfx/main.cpp),)
	export LD	:=	$(CC)
else
	export LD	:=	$(CXX)
endif

all:	wii64-glN64.elf

menu/MenuResources.o:	menu/MenuResources.s
				$(CC) -x assembler-with-cpp $(CFLAGS) -c -o $@ $<

main/dsi_handler.o:		main/dsi_handler.s
				$(CC) -x assembler-with-cpp $(CFLAGS) -D_LANGUAGE_ASSEMBLY -c -o $@ $<

gc_input/main.o:		gc_input/input.c
				$(CC) $(CFLAGS) -c -o $@ $<

gc_audio/main.o:		gc_audio/audio.c
				$(CC) $(CFLAGS) -c -o $@ $<

glN64_GX/glN64.o:			glN64_GX/glN64.cpp
				$(CXX) $(CFLAGS) -DMAINDEF -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/Config_linux.o:		glN64_GX/Config_linux.cpp
				$(CXX) $(CFLAGS) $(GTK_FLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/OpenGL.o:			glN64_GX/OpenGL.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/N64.o:			glN64_GX/N64.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/RSP.o:			glN64_GX/RSP.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/VI.o:			glN64_GX/VI.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/Textures.o:		glN64_GX/Textures.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/FrameBuffer.o:		glN64_GX/FrameBuffer.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/Combiner.o:		glN64_GX/Combiner.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/gDP.o:			glN64_GX/gDP.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/gSP.o:			glN64_GX/gSP.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/GBI.o:			glN64_GX/GBI.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/DepthBuffer.o:			glN64_GX/DepthBuffer.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/CRC.o:			glN64_GX/CRC.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/2xSAI.o:			glN64_GX/2xSAI.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/TEV_combiner.o: glN64_GX/TEV_combiner.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/RDP.o:			glN64_GX/RDP.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3D.o:			glN64_GX/F3D.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DEX.o:		glN64_GX/F3DEX.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DEX2.o:			glN64_GX/F3DEX2.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/L3D.o:			glN64_GX/L3D.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/L3DEX.o:			glN64_GX/L3DEX.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/L3DEX2.o:			glN64_GX/L3DEX2.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/S2DEX.o:			glN64_GX/S2DEX.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/S2DEX2.o:			glN64_GX/S2DEX2.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DPD.o:			glN64_GX/F3DPD.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DDKR.o:			glN64_GX/F3DDKR.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DWRUS.o:		glN64_GX/F3DWRUS.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

glN64_GX/F3DCBFD.o:		glN64_GX/F3DCBFD.cpp
				$(CXX) $(CFLAGS) -D__LINUX__ -D__GX__ -c -o $@ $<

wii64-glN64.elf:	$(OBJ) $(OBJ_INPUT) $(OBJ_GLN64_GX) $(OBJ_AUDIO) $(OBJ_RSPHLE) $(OBJ_PPC)
		$(LD) $^ $(LDFLAGS) $(LIB) -o $@
		elf2dol wii64-glN64.elf wii64-glN64.dol

install:
	cp mupen64 "$(PREFIX)bin"
	cp mupen64_nogui "$(PREFIX)bin"
	mkdir "$(SHARE)" | echo
	cp -rv mupen64.ini "$(SHARE)"
	cp -rv lang "$(SHARE)"
	cp -rv plugins "$(SHARE)"
	cp -rv doc "$(SHARE)"
	
clean:
	find . -name '*.o' -print0 | xargs -0r rm -f