SOURCEDIR := $(abspath $(patsubst %/,%,$(dir $(abspath $(lastword \
	$(MAKEFILE_LIST))))))

NAME := melonds
JGNAME := $(NAME)-jg

FLAGS := -std=c++17
FLAGS_C := -std=c99

SRCDIR := $(SOURCEDIR)/../src

INCLUDES_JG = -I$(SRCDIR)

# Only used by the vendored teakra
CFLAGS_TEAKRA = -I$(SRCDIR)/teakra/include

LINKER = $(CXX)

LIBS = -lm
LIBS_STATIC = -lstdc++

LIBS_REQUIRES :=

DOCS := ../LICENSE README

# Object dirs
MKDIRS := src/teakra/src src/fatfs src/sha1 src/tiny-AES-c src/xxhash

override INSTALL_DATA := 0
override INSTALL_EXAMPLE := 0
override INSTALL_SHARED := 0

include $(SOURCEDIR)/version.h
include $(SOURCEDIR)/mk/jg.mk

# Only required for version.h.in
INCLUDES := -I$(OBJDIR)/src

INCLUDES_JG += $(CFLAGS_SAMPLERATE)
LIBS_JG = $(LIBS_SAMPLERATE)

EXT := cpp

# Core
CSRCS := src/fatfs/ff.c \
	src/fatfs/ffsystem.c \
	src/fatfs/ffunicode.c \
	src/sha1/sha1.c \
	src/tiny-AES-c/aes.c \
	src/xxhash/xxhash.c

CXXSRCS := src/teakra/src/ahbm.cpp \
	src/teakra/src/apbp.cpp \
	src/teakra/src/btdmp.cpp \
	src/teakra/src/disassembler.cpp \
	src/teakra/src/disassembler_c.cpp \
	src/teakra/src/dma.cpp \
	src/teakra/src/memory_interface.cpp \
	src/teakra/src/mmio.cpp \
	src/teakra/src/parser.cpp \
	src/teakra/src/processor.cpp \
	src/teakra/src/teakra.cpp \
	src/teakra/src/timer.cpp \
	src/ARCodeFile.cpp \
	src/AREngine.cpp \
	src/ARM.cpp \
	src/ARMInterpreter.cpp \
	src/ARMInterpreter_ALU.cpp \
	src/ARMInterpreter_Branch.cpp \
	src/ARMInterpreter_LoadStore.cpp \
	src/CP15.cpp \
	src/CRC32.cpp \
	src/DMA.cpp \
	src/DMA_Timings.cpp \
	src/DSi.cpp \
	src/DSi_AES.cpp \
	src/DSi_Camera.cpp \
	src/DSi_DSP.cpp \
	src/DSi_I2C.cpp \
	src/DSi_NAND.cpp \
	src/DSi_NDMA.cpp \
	src/DSi_NWifi.cpp \
	src/DSi_SD.cpp \
	src/DSi_SPI_TSC.cpp \
	src/FATIO.cpp \
	src/FATStorage.cpp \
	src/FreeBIOS.cpp \
	src/GBACart.cpp \
	src/GBACartMotionPak.cpp \
	src/GPU.cpp \
	src/GPU2D.cpp \
	src/GPU2D_Soft.cpp \
	src/GPU3D.cpp \
	src/GPU3D_Soft.cpp \
	src/NDS.cpp \
	src/NDSCart.cpp \
	src/NDSCartR4.cpp \
	src/ROMList.cpp \
	src/RTC.cpp \
	src/SPI.cpp \
	src/SPI_Firmware.cpp \
	src/SPU.cpp \
	src/Savestate.cpp \
	src/Utils.cpp \
	src/Wifi.cpp \
	src/WifiAP.cpp

#	src/ARM_InstrInfo.cpp \

JGSRCS := jg.cpp

# List of object files
OBJS := $(patsubst %,$(OBJDIR)/%,$(CSRCS:.c=.o) $(CXXSRCS:.cpp=.o))
OBJS_JG := $(patsubst %,$(OBJDIR)/%,$(JGSRCS:.cpp=.o)) $(OBJS_SAMPLERATE)

# Dependency commands
BUILD_C = $(call COMPILE_C, $(FLAGS_C))
BUILD_TEAKRA = $(call COMPILE_CXX, $(FLAGS) $(CFLAGS_TEAKRA))

# Core commands
BUILD_JG = $(call COMPILE_CXX, $(FLAGS) $(INCLUDES_JG) $(CFLAGS_JG))
BUILD_MAIN = $(call COMPILE_CXX, $(FLAGS) $(INCLUDES))

.PHONY: $(PHONY)

all: $(TARGET)

# Dep rules
$(OBJDIR)/src/%.o: $(SRCDIR)/%.c $(PREREQ)
	$(call COMPILE_INFO,$(BUILD_C))
	@$(BUILD_C)

$(OBJDIR)/src/teakra/%.o: $(SRCDIR)/teakra/%.$(EXT) $(PREREQ)
	$(call COMPILE_INFO,$(BUILD_TEAKRA))
	@$(BUILD_TEAKRA)

# Core rules
$(OBJDIR)/src/version.h: $(SRCDIR)/version.h.in $(PREREQ)
	@sed -e 's|$${melonDS_HOMEPAGE_URL}|https://gitlab.com/jgemu/melonds|' \
		-e 's|$${melonDS_VERSION}|$(VERSION)|' \
		-e 's|$${MELONDS_VERSION_SUFFIX}|JG|' \
		$< \
		> $@

$(OBJDIR)/src/%.o: $(SRCDIR)/%.$(EXT) $(OBJDIR)/src/version.h
	$(call COMPILE_INFO,$(BUILD_MAIN))
	@$(BUILD_MAIN)

include $(SOURCEDIR)/mk/rules.mk
