# Linker Script
LINKER_SCRIPT = ../sections.ld

# Files to be compiled (important: defined prior to importing common.mk!)
CC_SOURCES = $(shell find * -name "*.cc" -a ! -name '.*' )
ASM_SOURCES = $(shell find * -name "*.asm"  -a ! -name '.*' )

# C Runtime Sources (CRT*_OBJECT will be defined by the build.mk)
CRTI_SOURCE = ../../libsys/crti.asm
CRTN_SOURCE = ../../libsys/crtn.asm

# Include Makefile
include ../../tools/common.mk

# Default target
.DEFAULT_GOAL = all

# OOStuBSmI
#all: $(BUILDDIR)/app.img
# MPStuBSmI
all: $(BUILDDIR)/app.elf

# Parameters & flags:
CXXFLAGS += -I../../libsys
# Enable 16-byte compare-and-exchange instruction for debugging purposes (stack alignment)
#CXXFLAGS += -mcx16
#CXXFLAGS_DEFAULT += -I../../libsys
# Allow FPU
#CXXFLAGS := $(filter-out $(CXXFLAGS_NOFPU),$(CXXFLAGS))

# Libsys static library
LDLIBS += -L../../libsys/$(BUILDDIR) -lsys


# Build C Initialize Object (from parent directory)
INITOBJ = $(BUILDDIR)/init.o
$(INITOBJ): ../init.cc $(MAKEFILE_LIST)
	@echo "CXX		$<"
	@mkdir -p $(@D)
	$(VERBOSE) $(CXX) -c $(CXXFLAGS) -o $@ $<


# Linked applications
$(BUILDDIR)/app.elf: $(CRTI_OBJECT) $(CRTN_OBJECT) $(INITOBJ) $(ASM_OBJECTS) $(CC_OBJECTS) $(LINKER_SCRIPT) $(MAKEFILE_LIST)
	@echo "LD		$@"
	@mkdir -p $(@D)
	$(VERBOSE) $(CXX) $(CXXFLAGS) -Wl,-T $(LINKER_SCRIPT) -o $@ $(LDFLAGS) $(INITOBJ) $(CRTI_OBJECT) $(CRTBEGIN_OBJECT) $(ASM_OBJECTS) $(CC_OBJECTS) $(LDLIBS) $(LIBGCC) $(CRTEND_OBJECT) $(CRTN_OBJECT)


# OOStuBSmI: Flat Binary
# 'app.flat' contains all section required for loading an application (flat binary)
$(BUILDDIR)/app.flat : $(BUILDDIR)/app.elf
	@echo "OBJCOPY		$@"
	@if ! nm $< | grep "4000000 T start" >/dev/null 2>&1 ; then echo "Symbol 'start' is not first address" ; exit 1 ; fi
	@if test \( ! \( -d $(@D) \) \) ;then mkdir -p $(@D);fi
	$(VERBOSE) objcopy -O binary --set-section-flags .bss=alloc,load,contents $< $@


# Include dependency files (generated gcc -MM)
ifneq ($(MAKECMDGOALS),clean)
-include $(DEP_FILES)
endif
