TARGET := retroarch_3ds_salamander
LIBRETRO =

DEBUG                   = 0
CONSOLE_LOG             = 0
BUILD_3DSX              = 1
BUILD_3DS               = 0
BUILD_CIA               = 1
USE_CTRULIB_2          ?= 0

APP_TITLE            = RetroArch 3DS
APP_DESCRIPTION      = RetroArch 3DS
APP_AUTHOR           = Team Libretro
APP_PRODUCT_CODE     = RETROARCH-3DS
APP_UNIQUE_ID        = 0xBAC00
APP_ICON             = pkg/ctr/assets/default.png
APP_BANNER           = pkg/ctr/assets/libretro_banner.png
APP_AUDIO            = pkg/ctr/assets/silent.wav
APP_RSF              = pkg/ctr/tools/template.rsf
APP_SYSTEM_MODE      = 64MB
APP_SYSTEM_MODE_EXT  = 124MB

OBJ := ctr/ctr_system.o \
		 ctr/ctr_memory.o \
		 ctr/ctr_linear.o \
		 frontend/frontend_salamander.o \
		 frontend/frontend_driver.o \
		 frontend/drivers/platform_ctr.o \
		 libretro-common/encodings/encoding_utf.o \
		 libretro-common/compat/compat_strcasestr.o \
		 libretro-common/compat/fopen_utf8.o \
		 libretro-common/file/file_path.o \
		 libretro-common/file/file_path_io.o \
		 libretro-common/string/stdstring.o \
		 libretro-common/lists/string_list.o \
		 libretro-common/lists/dir_list.o \
		 libretro-common/file/retro_dirent.o \
		 libretro-common/compat/compat_strl.o \
		 libretro-common/compat/compat_strldup.o \
		 libretro-common/file/config_file.o \
		 libretro-common/streams/file_stream.o \
		 libretro-common/vfs/vfs_implementation.o \
		 libretro-common/hash/lrc_hash.o \
		 libretro-common/time/rtime.o \
		 verbosity.o

OBJ += ctr/exec-3dsx/exec_cia.o \
	ctr/exec-3dsx/exec_3dsx.o \
	ctr/exec-3dsx/mini-hb-menu/launch.o \
	ctr/exec-3dsx/mini-hb-menu/loaders/rosalina.o \
	ctr/exec-3dsx/mini-hb-menu/loaders/hax2.o

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

ifeq ($(strip $(USE_CTRULIB_2)),1)
	CFLAGS += -DUSE_CTRULIB_2
endif

ifeq ($(strip $(DEVKITTOOLS)),)
	ifeq ($(strip $(USE_CTRULIB_2)),1)
		DEVKITTOOLS = $(DEVKITPRO)/tools
	else
		DEVKITTOOLS = $(DEVKITARM)
	endif
endif

ifeq ($(strip $(CTRULIB)),)
	CTRULIB = $(DEVKITPRO)/libctru
endif

APP_TITLE         := $(shell echo "$(APP_TITLE)" | cut -c1-128)
APP_DESCRIPTION   := $(shell echo "$(APP_DESCRIPTION)" | cut -c1-256)
APP_AUTHOR        := $(shell echo "$(APP_AUTHOR)" | cut -c1-128)
APP_PRODUCT_CODE  := $(shell echo $(APP_PRODUCT_CODE) | cut -c1-16)
APP_UNIQUE_ID     := $(shell echo $(APP_UNIQUE_ID) | cut -c1-7)

MAKEROM_ARGS_COMMON = -rsf $(APP_RSF) -exefslogo -elf $(TARGET).elf -icon $(TARGET).icn -banner $(TARGET).bnr -DAPP_TITLE="$(APP_TITLE)" -DAPP_PRODUCT_CODE="$(APP_PRODUCT_CODE)" -DAPP_UNIQUE_ID=$(APP_UNIQUE_ID) -DAPP_SYSTEM_MODE=$(APP_SYSTEM_MODE) -DAPP_SYSTEM_MODE_EXT=$(APP_SYSTEM_MODE_EXT)

INCDIRS := -I$(CTRULIB)/include
LIBDIRS := -L. -L$(CTRULIB)/lib

ARCH     := -march=armv6k -mtune=mpcore -mfloat-abi=hard -marm -mfpu=vfp -mtp=soft

CFLAGS	+=	-mword-relocations \
			-fomit-frame-pointer -ffast-math \
         -Werror=implicit-function-declaration \
			$(ARCH)

#CFLAGS	+= -Wall
CFLAGS	+=	-DARM11 -D_3DS

ifeq ($(strip $(USE_CTRULIB_2)),1)
   CFLAGS	+= -D__3DS__
endif

ifeq ($(DEBUG), 1)
   CFLAGS	+= -O0 -g
else
   CFLAGS	+= -O3
endif

ifeq ($(CONSOLE_LOG), 1)
   CFLAGS	+= -DCONSOLE_LOG
endif

CFLAGS += -I. -Ideps/7zip -Ideps/stb -Ilibretro-common/include -Ilibretro-common/include/compat/zlib

#CFLAGS += -DRARCH_INTERNAL
CFLAGS += -DRARCH_CONSOLE -DIS_SALAMANDER

CXXFLAGS	:= $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++11

ASFLAGS	:=	-g $(ARCH) -O3
LDFLAGS  +=	-specs=ctr/3dsx_custom.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)

CFLAGS   += -std=gnu99 -ffast-math

LIBS	:= -lctru -lm

ifeq ($(BUILD_3DSX), 1)
TARGET_3DSX := $(TARGET).3dsx $(TARGET).smdh
endif

ifeq ($(BUILD_3DS), 1)
TARGET_3DS := $(TARGET).3ds
endif

ifeq ($(BUILD_CIA), 1)
TARGET_CIA := $(TARGET).cia
endif

.PHONY: $(BUILD) clean all

all: $(TARGET)

$(TARGET): $(TARGET_3DSX) $(TARGET_3DS) $(TARGET_CIA)
$(TARGET).3dsx: $(TARGET).elf
$(TARGET).elf: $(OBJ)

PREFIX		:=	$(DEVKITARM)/bin/arm-none-eabi-

CC      := $(PREFIX)gcc
CXX     := $(PREFIX)g++
AS      := $(PREFIX)as
AR      := $(PREFIX)ar
OBJCOPY := $(PREFIX)objcopy
STRIP   := $(PREFIX)strip
NM      := $(PREFIX)nm
LD      := $(CXX)

ifeq ($(strip $(CTRBANNERTOOL)),)
	ifneq ($(findstring Linux,$(shell uname)),)
		BANNERTOOL = pkg/ctr/tools/bannertool-linux
	else ifneq ($(findstring Darwin,$(shell uname)),)
		BANNERTOOL = pkg/ctr/tools/bannertool-mac
	else
		BANNERTOOL = pkg/ctr/tools/bannertool.exe
	endif
else
	BANNERTOOL = $(CTRBANNERTOOL)
endif

ifeq ($(strip $(CTRMAKEROM)),)
	ifneq ($(findstring Linux,$(shell uname)),)
		MAKEROM    = pkg/ctr/tools/makerom-linux
	else ifneq ($(findstring Darwin,$(shell uname)),)
		MAKEROM    = pkg/ctr/tools/makerom-mac
	else
		MAKEROM    = pkg/ctr/tools/makerom.exe
	endif
else
	MAKEROM = $(CTRMAKEROM)
endif

%.o: %.vsh %.gsh
	$(DEVKITTOOLS)/bin/picasso $^ -o $*.shbin
	$(DEVKITTOOLS)/bin/bin2s $*.shbin | $(PREFIX)as -o $@
	rm $*.shbin

%.o: %.vsh
	$(DEVKITTOOLS)/bin/picasso $^ -o $*.shbin
	$(DEVKITTOOLS)/bin/bin2s $*.shbin | $(PREFIX)as -o $@
	rm $*.shbin

%.o: %.cpp
	$(CXX) -c -o $@ $< $(CXXFLAGS) $(INCDIRS)

%.o: %.c
	$(CC) -c -o $@ $< $(CFLAGS) $(INCDIRS)

%.o: %.s
	$(CC) -c -o $@ $< $(ASFLAGS)

%.o: %.S
	$(CC) -c -o $@ $< $(ASFLAGS)

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

%.vsh:

$(TARGET).smdh: $(APP_ICON)
	$(DEVKITTOOLS)/bin/smdhtool --create "$(APP_TITLE)" "$(APP_DESCRIPTION)" "$(APP_AUTHOR)" $(APP_ICON) $@

$(TARGET).3dsx: $(TARGET).elf
ifeq ($(APP_BIG_TEXT_SECTION), 1)
	cp pkg/ctr/big_text_section.xml $(TARGET).xml
else
	rm -f $(TARGET).xml
endif
	$(DEVKITTOOLS)/bin/3dsxtool $< $@ $(_3DSXFLAGS)

$(TARGET).elf: ctr/3dsx_custom_crt0.o
	$(LD) $(LDFLAGS) $(OBJ) $(LIBDIRS) $(LIBS) -o $@
	$(NM) -CSn $@ > $(notdir $*.lst)

$(TARGET).bnr: $(APP_BANNER) $(APP_AUDIO)
	$(BANNERTOOL) makebanner -i "$(APP_BANNER)" -a "$(APP_AUDIO)" -o $@

$(TARGET).icn: $(APP_ICON)
	$(BANNERTOOL) makesmdh -s "$(APP_TITLE)" -l "$(APP_TITLE)" -p "$(APP_AUTHOR)" -i $(APP_ICON) -o $@

$(TARGET).3ds: $(TARGET).elf $(TARGET).bnr $(TARGET).icn $(APP_RSF)
	$(MAKEROM) -f cci -o $@ $(MAKEROM_ARGS_COMMON) -DAPP_ENCRYPTED=true

$(TARGET).cia: $(TARGET).elf $(TARGET).bnr $(TARGET).icn $(APP_RSF)
	$(MAKEROM) -f cia -o $@ $(MAKEROM_ARGS_COMMON) -DAPP_ENCRYPTED=false

clean:
	rm -f $(OBJ)
	rm -f $(TARGET).3dsx
	rm -f $(TARGET).elf
	rm -f $(TARGET).3ds
	rm -f $(TARGET).cia
	rm -f $(TARGET).smdh
	rm -f $(TARGET).bnr
	rm -f $(TARGET).icn
	rm -f ctr/ctr_config_*.o
	rm -f ctr/3dsx_custom_crt0.o

.PHONY: clean