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

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

SRCDIR := $(SOURCEDIR)/src

INCLUDES = -I$(SRCDIR) -I$(DEPDIR)
INCLUDES_JG = -I$(SRCDIR)

LINKER = $(CC)

LIBS = $(CFLAGS_PTHREAD) -lm
LIBS_STATIC =
LIBS_REQUIRES := speexdsp

DOCS := README LICENSE

# Object dirs
MKDIRS := ai \
	bus \
	common \
	dd \
	deps/haxpatch \
	device \
	pi \
	rdp \
	ri \
	rsp \
	si \
	tlb \
	vi \
	vr4300

ENABLE_DEBUG_MMIO_REGISTER_ACCESS ?= 0
ENABLE_DEVPROF ?= 0

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

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

INCLUDES += $(CFLAGS_SPEEXDSP)
LIBS += $(LIBS_SPEEXDSP)

EXT := c
FLAGS := -std=c11 $(WARNINGS_DEF_C)
DEFS :=

ifneq ($(ENABLE_DEBUG_MMIO_REGISTER_ACCESS), 0)
	DEFS += -DDEBUG_MMIO_REGISTER_ACCESS
endif

ifneq ($(ENABLE_DEVPROF), 0)
	DEFS += -DCEN64_DEVPROF
endif

CSRCS := ai/controller.c \
	ai/resamp.c \
	bus/controller.c \
	bus/memorymap.c \
	common/cen64_file.c \
	common/cen64_input.c \
	common/debug.c \
	common/local_time.c \
	dd/controller.c \
	deps/haxpatch/haxpatch.c \
	device/bios.c \
	device/cart_db.c \
	device/device.c \
	device/save.c \
	device/state.c \
	pi/controller.c \
	pi/is_viewer.c \
	rdp/cpu.c \
	rdp/interface.c \
	rdp/rdp.c \
	rdp/rdp_blend.c \
	rdp/rdp_core.c \
	rdp/rdp_poly.c \
	rdp/rdp_texpipe.c \
	rdp/rdp_wqueue.c \
	ri/controller.c \
	rsp/cp0.c \
	rsp/cp2.c \
	rsp/cpu.c \
	rsp/decoder.c \
	rsp/functions.c \
	rsp/interface.c \
	rsp/opcodes.c \
	rsp/pipeline.c \
	rsp/rsp.c \
	rsp/vfunctions.c \
	si/cic.c \
	si/cic6105.c \
	si/controller.c \
	si/gb.c \
	si/input.c \
	si/pak.c \
	si/pak_transfer.c \
	si/rtc.c \
	tlb/tlb.c \
	vi/controller.c \
	vi/filter.c \
	vr4300/cp0.c \
	vr4300/cp1.c \
	vr4300/cpu.c \
	vr4300/dcache.c \
	vr4300/decoder.c \
	vr4300/fault.c \
	vr4300/functions.c \
	vr4300/icache.c \
	vr4300/interface.c \
	vr4300/opcodes.c \
	vr4300/pipeline.c \
	vr4300/segment.c

JGSRCS := jg.c

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

# Dependency commands
BUILD_DEPS = $(call COMPILE_C, $(FLAGS))

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

.PHONY: $(PHONY)

all: $(TARGET)

# Dependency Rules
$(OBJDIR)/deps/%.o: $(DEPDIR)/%.$(EXT) $(PREREQ)
	$(call COMPILE_INFO,$(BUILD_DEPS))
	@$(BUILD_DEPS)

# Rules
$(OBJDIR)/%.o: $(SRCDIR)/%.$(EXT) $(PREREQ)
	$(call COMPILE_INFO,$(BUILD_MAIN))
	@$(BUILD_MAIN)

include $(SOURCEDIR)/mk/rules.mk
