# GNU set up
GNU_PATH=/usr/arm-elf/bin
GNU_UTILITY_PATH=/usr/bin

PREFIX=$(GNU_PATH)
CC= $(PREFIX)/gcc
LD= $(PREFIX)/ld
AR= $(PREFIX)/ar
AS= $(PREFIX)/as
NM= $(PREFIX)/nm
RANLIBX= $(PREFIX)/ranlib
STRIP= $(PREFIX)/strip
OBJCOPY= $(GNU_UTILITY_PATH)/arm-elf-objcopy


# NETOS setup
NETOS_LIBPATH= ./../../../../lib/32b
NETOS_LIBS= -L $(NETOS_LIBPATH) -lna1 -ltcpip  -lna2 -ltx -lbsp
NETOS_BIN=./../../../../bin
COMPRESS=$(NETOS_BIN)/compress
BIN2OBJ=$(NETOS_BIN)/bin2obj


# debug flag
DEBUG_FLAG= -g

# C Warning level

# base compiler options
BASECFLAG=-mbig-endian -mcpu=arm7tdmi 

# defines/undefines
DEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE
ZDEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -DENABLE_FLASH_COMPRESSION -D_POSIX_SOURCE

# final C compiler options
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) 
ZCCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(ZDEF) 

# search path for source header file
INC= -I./../../../../h -I./../../../../h/threadx -I./../../../../h/tcpip

# assembler
ASFLAG= -EB

# search path(s) for source file or library
SRC=./../../../bsp
SRC2=./../../../../lib/32b
SRC3=./..
SRCDIR=-I$(SRC) -I$(SRC2) -I$(SRC3) 
VPATH=$(subst -I$,$,$(SRCDIR))

# directory to store obj files
OBJDIR=./objs
ZOBJDIR=./zobjs
# directory to store obj files
OBJDIR=./dobjs

# objects to be linked
O=$(OBJDIR)/root.o\
	$(OBJDIR)/telnet.o\
	$(OBJDIR)/serial.o\
	$(OBJDIR)/put.o\
	$(OBJDIR)/get.o\
	$(OBJDIR)/mbox.o\
	$(OBJDIR)/bsproot.o\
	$(OBJDIR)/dialog.o\
	$(OBJDIR)/decompress.o\
	$(OBJDIR)/shell.o\
	$(OBJDIR)/reset.o

O2=$(ZOBJDIR)/decompress.o\
	$(ZOBJDIR)/loader.o\
	$(ZOBJDIR)/ramimagezip.o\
	$(ZOBJDIR)/reset.o

# linker options
LINKOPT= -mbig-endian
RAMLINKOPT= -mbig-endian

# linker command file
LINK_CMD=./../debug.ld
ROM_LINK_CMD=./../rom.ld
RAM_LINK_CMD=./../ramimagezip.ld
ROMZIP_LINK_CMD=./../romzip.ld

# output file name(s)
NAME=debug.x
ROM=rom.x
ROMBIN=rom.bin
ROMZIP=romzip.x
ROMZIPBIN=romzip.bin
RAM=ram.x
RAMIMAGEZIP=ramimagezip.bin
RAMBIN=ram.bin
SYMFILE=debug.sym
MAPFILE=debug.map
ROMSYMFILE=rom.sym
ROMMAPFILE=rom.map
RAMMAPFILE=ram.map
ROMZIPMAPFILE=romzip.map

# goal(s)
all: $(OBJDIR) $(ZOBJDIR) $(NAME) $(ROMBIN) $(ROMZIPBIN)

# rules begins
$(OBJDIR)/%.o: %.c
	$(CC) -c $(SRCDIR) $(INC) $(CCFLAGS) $< -o $@

$(OBJDIR)/%.o: %.s
	$(AS) $(ASFLAG) $< -o $@

$(ZOBJDIR)/%.o: %.c
	$(CC) -c $(SRCDIR) $(INC) $(ZCCFLAGS) $< -o $@

$(ZOBJDIR)/%.o: %.s
	$(AS) $(ASFLAG) $< -o $@

$(ZOBJDIR)/ramimagezip.o: $(RAMIMAGEZIP)
	@echo "bin2obj $(RAMIMAGEZIP)  ..."
	$(BIN2OBJ) $(RAMIMAGEZIP) $(ZOBJDIR)/ramimagezip.o

$(NAME): $(O) $(LINK_CMD)
	$(CC) -o  $(NAME) $(O) $(LINKOPT) -T $(LINK_CMD) $(NETOS_LIBS) -Wl,-Map,$(MAPFILE)
	$(NM) -n $(NAME) > $(SYMFILE)

$(ROM): $(O) $(ROM_LINK_CMD)
	$(CC) -o  $(ROM) $(O) $(LINKOPT) -T $(ROM_LINK_CMD) $(NETOS_LIBS) -Wl,-Map,$(ROMMAPFILE)
	$(NM) -n $(ROM) > $(ROMSYMFILE)

$(ROMBIN): $(ROM)
	$(OBJCOPY) -O binary $(ROM) $(ROMBIN)

$(RAM): $(O) $(RAM_LINK_CMD)
	$(CC) -o  $(RAM) $(O) $(RAMLINKOPT) -T $(RAM_LINK_CMD) $(NETOS_LIBS) -Wl,-Map,$(RAMMAPFILE)

$(RAMBIN): $(RAM)
	$(OBJCOPY) -O binary $(RAM) $(RAMBIN)

$(RAMIMAGEZIP): $(RAMBIN)
	@echo "compress $(RAMBIN) $(RAMIMAGEZIP) ..."
	$(COMPRESS) $(RAMBIN) $(RAMIMAGEZIP)

$(ROMZIP): $(O2) $(ROMZIP_LINK_CMD)
	$(CC) -o  $(ROMZIP) $(O2) $(LINKOPT) -nostartfiles -T $(ROMZIP_LINK_CMD) -L $(NETOS_LIBPATH) -lbsp -Wl,-Map,$(ROMZIPMAPFILE)

$(ROMZIPBIN): $(ROMZIP)
	$(OBJCOPY) -O binary $(ROMZIP) $(ROMZIPBIN)


# clean up
clean:
	rm -f $(OBJDIR)/*.o $(OBJDIR)/*.d $(OBJDIR)/*.elf $(OBJDIR)/*.out $(OBJDIR)/*.lst\
	$(OBJDIR)/*.cmd ./*.x ./*.bin ./*.sym ./*.map
	rm -f $(ZOBJDIR)/*.o $(ZOBJDIR)/*.d $(ZOBJDIR)/*.elf $(ZOBJDIR)/*.out $(ZOBJDIR)/*.lst\
	$(ZOBJDIR)/*.cmd

# make object directory
.PHONY: $(OBJDIR)
$(OBJDIR):
	mkdir -p $(OBJDIR)
.PHONY: $(ZOBJDIR)
$(ZOBJDIR):
	mkdir -p $(ZOBJDIR)

# header dep.
$(OBJDIR)/root.o: ./../../h/threadx/tx_api.h
$(OBJDIR)/bsproot.o: starttcp.h appconf.h ./../../h/bspconf.h  ./../../h/bsptimer.h dialog.h
$(OBJDIR)/dialog.o: ./../../h/Ncc_io.h ./../../h/threadx/tx_api.h appconf.h ./../../h/narmsrln.h\
  dialog.h ./../../h/netosIo.h
$(OBJDIR)/decompress.o: ./../../h/Ncc_io.h ./../../h/narmled.h
$(OBJDIR)/telnet.o: ./../../h/tservapi.h serl_mod.h mbox_def.h telnet.h
$(OBJDIR)/serial.o: mbox_def.h serl_mod.h telnet.h
$(OBJDIR)/put.o: ./../../h/tservapi.h serl_mod.h mbox_def.h telnet.h
$(OBJDIR)/get.o: ./../../h/tservapi.h serl_mod.h mbox_def.h telnet.h
$(OBJDIR)/mbox.o: mbox_def.h mbox_mod.h

