# See readme.txt for the make API

# Add ARCH to each of the compiler programs
ifeq ($(XCC),)
	XCC = $(ARCH)gcc
endif
ifeq ($(XCXX),)
	XCXX = $(ARCH)g++
endif
ifeq ($(XAS),)
	XAS = $(ARCH)gcc -x assembler-with-cpp
endif
ifeq ($(XLD),)
	XLD = $(ARCH)gcc
endif

# Default project name is the project directory name
ifeq ($(PROJECT),)
	PROJECT := $(notdir $(patsubst %/,%,$(dir $(abspath $(firstword $(MAKEFILE_LIST))))))
endif

# Output directory and files
ifeq ($(BUILDDIR),)
	ifeq ($(MAKECMDGOALS),Debug)
	  BUILDDIR = bin/Debug
	else ifeq ($(MAKECMDGOALS),Release)
	  BUILDDIR = bin/Release
	else ifeq ($(MAKECMDGOALS),cleanDebug)
	  BUILDDIR = bin/Debug
	else ifeq ($(MAKECMDGOALS),cleanRelease)
	  BUILDDIR = bin/Release
	else
	  BUILDDIR = .build
	endif
endif

OBJDIR  = $(BUILDDIR)/obj
DEPDIR  = $(BUILDDIR)/dep

SRCFILE = $<
OBJFILE = $@
LSTFILE = $(@:.o=.lst)
MAPFILE = $(BUILDDIR)/$(PROJECT).map
ifeq ($(OPT_NATIVEOS),win32)
	EXEFILE = $(BUILDDIR)/$(PROJECT).exe
else
	EXEFILE = $(BUILDDIR)/$(PROJECT)
endif

SRCFLAGS += -I. $(patsubst %,-I%,$(INCPATH)) $(patsubst %,-D%,$(patsubst -D%,%,$(DEFS)))
LDFLAGS  += $(patsubst %,-L%,$(LIBPATH)) $(patsubst %,-l%,$(patsubst -l%,%,$(LIBS)))
OBJS	  = $(addprefix $(OBJDIR)/,$(subst ../,_dot_dot/,$(addsuffix .o,$(basename $(SRC)))))

ifeq ($(OPT_GENERATE_MAP),yes)
	LDFLAGS += -Wl,-Map=$(MAPFILE),--cref,--no-warn-mismatch
endif
ifeq ($(OPT_GENERATE_LISTINGS),yes)
	CFLAGS += -Wa,-alms=$(LSTFILE)
	CXXFLAGS += -Wa,-alms=$(LSTFILE)
	ASFLAGS += -Wa,-amhls=$(LSTFILE)
endif

# Generate dependency information
SRCFLAGS += -MMD -MP -MF $(DEPDIR)/$(@F).d

#
# makefile rules
#

.PHONY: builddirs fakefile.o all clean Debug Release cleanDebug cleanRelease

Debug Release:				all
cleanDebug cleanRelease:	clean

all: builddirs fakefile.o $(EXEFILE)

builddirs:
	@mkdir -p $(BUILDDIR)
	@mkdir -p $(OBJDIR)
	@mkdir -p $(DEPDIR)

fakefile.o:
ifneq ($(OPT_VERBOSE_COMPILE),yes)
	@echo Compiler Options - $(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) fakefile.c -o $(OBJDIR)/$@
	@echo
endif

.SECONDEXPANSION:
$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c)
	@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
	@echo
	$(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) $< -o $@
else
	@echo Compiling $<
	@$(XCC) -c $(CPPFLAGS) $(CFLAGS) $(SRCFLAGS) $< -o $@
endif

$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.cpp)
	@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
	@echo
	$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
else
	@echo Compiling $<
	@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
endif

$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.c++)
	@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
	@echo
	$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
else
	@echo Compiling $<
	@$(XCXX) -c $(CPPFLAGS) $(CXXFLAGS) $(SRCFLAGS) $< -o $@
endif

$(OBJDIR)/%.o : $$(subst _dot_dot/,../,%.s)
	@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
	@echo
	$(XAS) -c $(CPPFLAGS) $(ASFLAGS) $(SRCFLAGS) $< -o $@
else
	@echo Compiling $<
	@$(XAS) -c $(CPPFLAGS) $(ASFLAGS) $(SRCFLAGS) $< -o $@
endif

$(EXEFILE): $(OBJS)
	@mkdir -p $(dir $@)
ifeq ($(OPT_VERBOSE_COMPILE),yes)
	@echo
	$(XLD) $(OBJS) $(LDFLAGS) -o $@
else
	@echo Linking $@
	@$(XLD) $(OBJS) $(LDFLAGS) -o $@
endif
ifeq ($(OPT_COPY_EXE),yes)
	@cp $(EXEFILE) .
endif

gcov:
	-mkdir gcov
	$(COV) -u $(subst /,\,$(SRC))
	-mv *.gcov ./gcov

#
# Include the dependency files, should be the last of the makefile except for clean
#
-include $(shell mkdir -p $(DEPDIR) 2>/dev/null) $(wildcard $(DEPDIR)/*)

clean:
	-rm -fR $(BUILDDIR)

# *** EOF ***