#---------------------------------------------------------------------------------
# Выбор платформы: "switch" или "linux" (По умолчанию: switch)
# Для сборки под Linux пиши: make PLATFORM=linux
#---------------------------------------------------------------------------------
PLATFORM ?= switch

#---------------------------------------------------------------------------------
# Общие настройки проекта
#---------------------------------------------------------------------------------
TOPDIR      ?= $(CURDIR)
TARGET      := abepic_nx
APP_TITLE   := Epic
APP_AUTHOR  := ChanseyIsTheBest & lsmsmx
APP_VERSION := 1.0
APP_ICON    := $(TOPDIR)/icon.png
export APP_TITLE APP_AUTHOR APP_VERSION APP_ICON
BUILD       := build
SOURCES     := source
INCLUDES    := source

#---------------------------------------------------------------------------------
# Ветка компиляции под NINTENDO SWITCH
#---------------------------------------------------------------------------------
ifeq ($(PLATFORM),switch)
  ifeq ($(strip $(DEVKITPRO)),)
    $(error "Please set DEVKITPRO in your environment. export DEVKITPRO=/opt/devkitpro")
  endif

  include $(DEVKITPRO)/libnx/switch_rules

  # Глобальные пути поиска
  INCLUDE := -I$(DEVKITPRO)/libnx/include \
             -I$(PORTLIBS)/include \
             -I$(PORTLIBS)/include/SDL2 \
             -I$(CURDIR)/source \
             -I$(CURDIR)/../source

  ARCH     := -march=armv8-a+crc+crypto -mtune=cortex-a57 -mtp=soft -fPIE
  CFLAGS   := -g -Wall -O2 -ffunction-sections $(ARCH) -D__SWITCH__ -DCRASH_LOG_PRINTF=debugPrintf
  CFLAGS   += -DLOAD_ADDRESS=0x0C000000
  CFLAGS   += $(INCLUDE)

  CXXFLAGS := $(CFLAGS) -fno-rtti -fno-exceptions -std=gnu++17
  ASFLAGS  := -g $(ARCH)
  LDFLAGS  := -specs=$(DEVKITPRO)/libnx/switch.specs -g $(ARCH) -Wl,-Map,$(notdir $*.map)

  LIBS     := -lSDL2 -lGLESv2 -lEGL -lglapi -ldrm_nouveau -lpng -lz -lnx -lm
  LIBDIRS  := $(PORTLIBS) $(LIBNX)

  ifneq ($(BUILD),$(notdir $(CURDIR)))
    export OUTPUT  := $(CURDIR)/$(TARGET)
    export TOPDIR  := $(CURDIR)
    export DEPSDIR := $(CURDIR)/$(BUILD)
    export VPATH   := $(foreach dir,$(SOURCES),$(CURDIR)/$(dir))

    CFILES   := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.c)))
    CPPFILES := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.cpp)))
    SFILES   := $(foreach dir,$(SOURCES),$(notdir $(wildcard $(dir)/*.s)))

    export OFILES  := $(SFILES:.s=.o) $(CPPFILES:.cpp=.o) $(CFILES:.c=.o)
    export INCLUDE += $(foreach dir,$(INCLUDES),-I$(CURDIR)/$(dir)) \
                      $(foreach dir,$(LIBDIRS),-I$(dir)/include) \
                      -I$(PORTLIBS)/include/SDL2 \
                      -I$(PORTLIBS)/include \
                      -I$(DEVKITPRO)/libnx/include

    export LIBPATHS := $(foreach dir,$(LIBDIRS),-L$(dir)/lib)
  endif

  export LD := $(CXX)

#---------------------------------------------------------------------------------
# Ветка компиляции под NATIVE LINUX ARM64 (L4T)
#---------------------------------------------------------------------------------
else ifeq ($(PLATFORM),linux)
  CC       := gcc
  CXX      := g++
  LD       := g++

  # Указываем make искать исходники в папке source/
  VPATH    := $(SOURCES)

  CFLAGS   := -g -Wall -O2 -ffunction-sections -D__linux__ -DCRASH_LOG_PRINTF=printf
  CXXFLAGS := $(CFLAGS) -std=gnu++17
  LDFLAGS  := -g -Wl,-Map,$(TARGET).map

  LIBS     := -lSDL2 -lGLESv2 -lEGL -lpng -lz -lm -lpthread -ldl
  INCLUDE  := -I$(CURDIR)/$(INCLUDES) -I/usr/include/SDL2
  LIBPATHS :=

  CFILES   := main.c so_util.c libc_shim.c jni_fake.c bp_patches.c bp_unlocks.c config.c fakefd.c firebase_stub.c unity_input_hook.c opensles.c diag.c unity_glue.c unity_jni.c imports.c util.c error.c android_native_unity.c cr3_stubs.c unity_imports.c ndk_stubs.c nx_pointer.c
  SFILES   := bp_tm_trampoline.s
  OFILES   := $(CFILES:.c=.o) $(SFILES:.s=.o)
endif

#---------------------------------------------------------------------------------
# Правила сборки
#---------------------------------------------------------------------------------
.PHONY: all clean

ifeq ($(PLATFORM),switch)
  ifneq ($(BUILD),$(notdir $(CURDIR)))
    all: $(BUILD)
	@$(MAKE) --no-print-directory -C $(BUILD) -f $(CURDIR)/Makefile PLATFORM=switch
    $(BUILD):
	@mkdir -p $@
    clean:
	@rm -fr $(BUILD) $(TARGET).nro $(TARGET).nacp $(TARGET).elf
  else
    DEPENDS := $(OFILES:.o=.d)
    NROFLAGS := --icon=$(APP_ICON) --nacp=$(OUTPUT).nacp
    all: $(OUTPUT).nro
    $(OUTPUT).nro: $(OUTPUT).elf $(OUTPUT).nacp
    $(OUTPUT).elf: $(OFILES)
	$(LD) $(LDFLAGS) $(LIBPATHS) $^ $(LIBS) -o $@
    -include $(DEPENDS)
  endif

else ifeq ($(PLATFORM),linux)
  VPATH := $(SOURCES)

  all: $(TARGET)

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

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

  $(TARGET): $(OFILES)
	$(LD) $(LDFLAGS) $(LIBPATHS) $^ $(LIBS) -o $@

  clean:
	@rm -f *.o $(TARGET) $(TARGET).map
endif
