# Disable default Make rules
.SUFFIXES:

# Define the default recipe
default:

include build/config.mak
include build/pimp.mak
include build/defaults.mak
include build/platform.$(PLATFORM).mak
include build/toolchain.$(TOOLCHAIN).mak
include build/variants.mak
include build/helpers.mk

ifeq (${MODEL}, n0100)
  ifeq ($(filter reader,$(apps_list)),)
  	$(warning reader app included, removing it on n0100. )
  	EPSILON_APPS := $(filter-out reader,$(EPSILON_APPS))
  endif
  ifneq ($(words $(EPSILON_I18N)), 1)
  	$(warning Only use 1 language on n0100, defaulting to en. )
  	EPSILON_I18N := en
  endif
  ifeq ($(INCLUDE_ULAB), 1)
    $(warning Removing uLab on n0100. )
    INCLUDE_ULAB := 0
  endif
endif

ifeq (${OTG}, n0120)
	SFLAGS += -DN0120
endif

SHIFTED_USERLAND ?= 0
ifeq (${SHIFTED_USERLAND}, 1)
	SFLAGS += -DSHIFTED_USERLAND
endif

SFLAGS += -DDFU_PROTECT=0x90400000 # alwasy check

ifeq ($(filter reader,$(apps_list)),)
  HAS_READER := 1
endif

# Remove the external apps for the n0100
ifeq (${MODEL}, n0100)
    apps_list = $(foreach i, ${EPSILON_APPS}, $(if $(filter external, $(i)),,$(i)))
else
    apps_list = ${EPSILON_APPS}
endif

ifdef FORCE_EXTERNAL
  apps_list = ${EPSILON_APPS}
endif

ifeq ($(INCLUDE_ULAB), 1)
  SFLAGS += -DINCLUDE_ULAB
endif

ifdef HOME_DISPLAY_EXTERNALS
  ifneq ($(filter external,$(apps_list)),)
    SFLAGS += -DHOME_DISPLAY_EXTERNALS
  else
    $(warning HOME_DISPLAY_EXTERNALS is set but external isn't included, ignoring flag.)
  endif
endif

.PHONY: info
info:
	@echo "EPSILON_VERSION = $(EPSILON_VERSION)"
	@echo "EPSILON_APPS = $(EPSILON_APPS)"
	@echo "EPSILON_I18N = $(EPSILON_I18N)"
	@echo "THEME_NAME = $(THEME_NAME)"
	@echo "THEME_REPO = $(THEME_REPO)"
	@echo "BUILD_DIR = $(BUILD_DIR)"
	@echo "PLATFORM" = $(PLATFORM)
	@echo "DEBUG" = $(DEBUG)
	@echo "EPSILON_GETOPT" = $(EPSILON_GETOPT)
	@echo "ESCHER_LOG_EVENTS_BINARY" = $(ESCHER_LOG_EVENTS_BINARY)
	@echo "QUIZ_USE_CONSOLE" = $(QUIZ_USE_CONSOLE)
	@echo "ION_STORAGE_LOG" = $(ION_STORAGE_LOG)
	@echo "POINCARE_TREE_LOG" = $(POINCARE_TREE_LOG)
	@echo "POINCARE_TESTS_PRINT_EXPRESSIONS" = $(POINCARE_TESTS_PRINT_EXPRESSIONS)

.PHONY: help
help:
	@echo "Device targets"
	@echo "  make epsilon_flash"
	@echo "  make epsilon.dfu"
	@echo "  make epsilon.onboarding.dfu"
	@echo "  make epsilon.onboarding.update.dfu"
	@echo "  make epsilon.onboarding.beta.dfu"
	@echo "  make flasher.light.bin"
	@echo "  make flasher.verbose.dfu"
	@echo "  make bench.ram.bin"
	@echo "  make bench.flash.bin"
	@echo "  make binpack"
	@echo ""
	@echo "Simulator targets"
	@echo "  make PLATFORM=simulator"
	@echo "  make PLATFORM=simulator TARGET=android"
	@echo "  make PLATFORM=simulator TARGET=ios"
	@echo "  make PLATFORM=simulator TARGET=macos"
	@echo "  make PLATFORM=simulator TARGET=web"
	@echo "  make PLATFORM=simulator TARGET=windows"
	@echo "  make PLATFORM=simulator TARGET=3ds"
	@echo "  make PLATFORM=simulator TARGET=fxcg"

.PHONY: doc
doc:
	@echo "DOXYGEN"
	@mkdir -p output/doc/
	$(Q) doxygen build/doc/Doxyfile

.PHONY: print-%
print-%:
	@echo $* = $($*)
	@echo $*\'s origin is $(origin $*)

# Since we're building out-of-tree, we need to make sure the output directories
# are created, otherwise the recipes will fail (e.g. gcc will fail to create
# "output/foo/bar.o" because the directory "output/foo" doesn't exist).
# We need to mark those directories as precious, otherwise Make will try to get
# rid of them upon completion (and fail, since those folders won't be empty).
.PRECIOUS: $(BUILD_DIR)/. $(BUILD_DIR)%/.
$(BUILD_DIR)/.:
	$(Q) mkdir -p $(dir $@)
$(BUILD_DIR)%/.:
	$(Q) mkdir -p $(dir $@)

# To make objects dependent on their directory, we need a second expansion
.SECONDEXPANSION:

# Each sub-Makefile can either add sources to $(%_src) variables or define a
# new executable target. The $(%_src) variables list the sources that can be
# built and linked to executables being generated.
ifndef USE_LIBA
  $(error platform.mak should define USE_LIBA)
endif
ifeq ($(USE_LIBA),0)
include liba/Makefile.bridge
include libaxx/Makefile.bridge
else
SFLAGS += -ffreestanding -nostdinc -nostdlib
include liba/Makefile
include libaxx/Makefile
endif
include ion/Makefile
include kandinsky/Makefile
include poincare/Makefile
include python/Makefile
include escher/Makefile
# Executable Makefiles
include bootloader/Makefile
include apps/Makefile
include build/struct_layout/Makefile
include build/scenario/Makefile
include quiz/Makefile # Quiz needs to be included at the end

all_src = $(apps_src) $(escher_src) $(ion_src) $(kandinsky_src) $(liba_src) $(libaxx_src) $(poincare_src) $(python_src) $(runner_src) $(ion_device_flasher_src) $(ion_device_bench_src) $(tests_src)
# Make palette.h a dep for every source-file.
# This ensures that the theming engine works correctly.
$(call object_for,$(all_src)): $(BUILD_DIR)/escher/palette.h $(BUILD_DIR)/apps/i18n.h

all_objs = $(call object_for,$(all_src))
.SECONDARY: $(all_objs)

# Load source-based dependencies
# Compilers can generate Makefiles that states the dependencies of a given
# objet to other source and headers. This serve no purpose for a clean build,
# but allows correct yet optimal incremental builds.
-include $(all_objs:.o=.d)

# Define main and shortcut targets
include build/targets.mak

# Fill in the default recipe
default: $(firstword $(HANDY_TARGETS)).$(firstword $(HANDY_TARGETS_EXTENSIONS))

# Load standard build rules
include build/rules.mk

.PHONY: clean
clean:
	@echo "CLEAN"
	$(Q) rm -rf $(BUILD_DIR)

.PHONY: cleanall
cleanall:
	@echo "CLEANALL"
	$(Q) rm -rf output

.PHONY: cowsay_%
cowsay_%:
	@echo " -------"
	@echo "| $(*F) |"
	@echo " -------"
	@echo "        \\   ^__^"
	@echo "         \\  (oo)\\_______"
	@echo "            (__)\\       )\\/\\"
	@echo "                ||----w |"
	@echo "                ||     ||"

.PHONY: clena
clena: cowsay_CLENA clean

.PHONY: compile
compile: output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE)

.PHONY: cleanandcompile
cleanandcompile:
	${MAKE} cleanall
	${MAKE} compile

.PHONY: start
start:
	@echo "INFO Starting output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE)"
	@$(Q) output/$(BUILD_TYPE)/simulator/$(HOST)/epsilon.$(EXE) -v

.PHONY: clean_run
clean_run: cleanandcompile
	${MAKE} start

.PHONY: run
run: compile
	${MAKE} start

.PHONY: translations
translations:
	@echo "TRANSLATIONS"
	$(Q) ${PYTHON} build/utilities/translate.py

.PHONY: translations_clean
translations_clean:
	@echo "TRANSLATIONS CLEAN"
	$(Q) ${PYTHON} build/utilities/translations_clean.py
