##############################################
# Root directory for netos.
#
ifeq "$(BASEDIR)" ""
BASEDIR=./../../../..
endif


##############################################
# Include GNU tools set up
#
include $(BASEDIR)/Makefile.tools

##############################################
# Include platform Makefile.bsp
#
ifeq "$(PLATFORMS_DIR)" ""
PLATFORMS_DIR=$(BASEDIR)/src/bsp/platforms
endif
include $(PLATFORMS_DIR)/$(PLATFORM)/Makefile.files


#################################
# Rules for generating linker scripts
#
BIN = /bin

ifeq "$(LDRDIRS)" ""
LS_CPP = $(BIN)/cpp -I$(PLATFORMS_DIR)/$(PLATFORM) -P -C 
else
LS_CPP = $(BIN)/cpp $(LDRDIRS) -P -C 
endif

CPPFLAGS = -P -C 

# NETOS setup
NETOS_LIBPATH= $(BASEDIR)/lib/$(CPU)/$(ENDIANDIR)/$(TOOLSET)
NETOS_BSPLIBPATH=$(NETOS_LIBPATH)/bsp/$(PLATFORM)
NETOS_LIBS= -L $(BOOTLOADER_LIBPATH) -L $(NETOS_LIBPATH) -L $(NETOS_BSPLIBPATH) -lbsp
BOOTLOADER_LIBPATH= ./../libs/$(TOOLSET)/$(PLATFORM)
NETOS_STARTFILE=./../libs/crt0.o
CLIB= -L ./../libs -lc -lgcc -lm
NETOS_BIN=$(BASEDIR)/bin
# COMPRESS=$(NETOS_BIN)/compress
BIN2OBJ=$(NETOS_BIN)/bin2obj
# BOOTHDR=$(NETOS_BIN)/boothdr
CHECKSIZE=$(NETOS_BIN)/checksize

LINKER_FILE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr

# debug flag
DEBUG_FLAG= -g

# CPU type inherited from Makefile.inc

# base compiler options
ifeq '$(TOOLSET)' 'arm'
ifeq "$(RVDS_VER)" "3.0"
BASECFLAG=$(ENDIAN) $(CPU_FLAG) $(CPU_ARCH) --apcs /adsabi
else
BASECFLAG=$(ENDIAN) $(CPU_FLAG) $(CPU_ARCH) --no_depend_system_headers
endif
else
BASECFLAG=-mbig-endian $(CPU_FLAG) $(CPU_ARCH)
endif

# defines/undefines
ifeq '$(TOOLSET)' 'arm'
DEF=-DDOTNETMF -DIAM_ENABLED -DNETOS_ARM_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE -DBOOT_LOADER $(CHIP_DEFINES) -D_LITTLE_ENDIAN -DTM_LITTLE_ENDIAN -DCLI_TRACE=0
ASDEF=-DNETOS_ARM_TOOLS=1 -DNET_OS=1 -DNET_WORKS=1 -D_POSIX_SOURCE=1 
else
DEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -D_POSIX_SOURCE -DBOOT_LOADER $(CHIP_DEFINES) -DIAM_ENABLED -DNET_OS_SPECIFIC
ASDEF=--defsym __GNU__=1 --defsym NETOS_GNU_TOOLS=1 --defsym NET_OS=1 --defsym NET_WORKS=1 --defsym _POSIX_SOURCE=1
endif

ifeq "$(STACK)" "treck"
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=1
else
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=0
endif



# optimization flag (optimize for size)
ifeq '$(TOOLSET)' 'arm'
OPTIMIZE=-O2
else
OPTIMIZE=-Os
endif

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

# search path for source header file
INC  = -I. -I$(BASEDIR)/h -I./.. -I../../h -I../net -I$(BASEDIR)/src/bsp/h
INC += -I$(BASEDIR)/h/threadx -I$(BASEDIR)/h/tcpip -I$(BASEDIR)/h/shared
INC += -I$(BASEDIR)/h/wln -I$(BASEDIR)/h/wpa -I$(BASEDIR)/h/wps
INC += -I$(BASEDIR)/h/idigi
ifneq "$(PLATFORM_INC)" ""
INC += $(PLATFORM_INC)
else
INC += $(PLATFORMS_DIR)/$(PLATFORM)
endif

ifeq '$(CPU)' 'arm9'
INC += -I$(BASEDIR)/h/arm9
endif

INC += -I$(BASEDIR)/src/treck/include
INC += -I$(BASEDIR)/src/treck/source/ossupport/netos
INC += -I$(BASEDIR)/src/treck/source/ossupport

# Assembler flags
ifeq '$(TOOLSET)' 'arm'
ifeq "$(RVDS_VER)" "3.0"
ASFLAG=$(CPU_FLAG) --apcs /adsabi
else
ASFLAG=$(CPU_FLAG)
endif
else
ASFLAG= -EB $(CPU_FLAG) -mfpu=softfpa
endif

#Source paths
BLROM_DIR=.
BOOTLOADER_DIR=./..
BSP_DIR=./../../common
BSP_DEVICES=./../../devices
BSP_CUSTOMIZE_DIR=./../../customize
RAM_IMAGE_DIR=./../ramImage
NET_DIR=./../net
BSP_DIR=./../../common
COMMON_GPIO=./../../devices/common/gpio
COMMON_NVRAM=$(BSP_DEVICES)/common/nvram

BL_LIBS = $(NETOS_BSPLIBPATH)/libbsp.a \
            $(NETOS_LIBPATH)/libflash.a \
            $(NETOS_LIBPATH)/libposix.a

ifeq '$(CPU)' 'arm9'
BL_LIBS += $(NETOS_LIBPATH)/libsflash.a
endif

ifeq '$(TOOLSET)' 'arm'
BL_LIBS += $(BOOTLOADER_LIBPATH)/libnet.a
endif

# search path(s) for source file or library
VPATH= $(BLROM_DIR):$(BOOTLOADER_DIR):$(NET_DIR):$(BSP_DIR):$(COMMON_GPIO):$(BSP_CUSTOMIZE_DIR):$(PLATFORM_SRC):$(COMMON_NVRAM)

# directory to store obj files
OBJS=./objs/$(TOOLSET)/$(PLATFORM)

BSPOBJS=./../../objs/$(ENDIANDIR)/$(TOOLSET)/$(PLATFORM)

RAMOBJS=./../ramImage

# objects to be linked
ifeq '$(TOOLSET)' 'arm'
OBJECTS=\
	$(OBJS)/blram.o\
	$(OBJS)/rommain.o\
	$(OBJS)/nainet.o\
	$(OBJS)/nawait.o\
	$(OBJS)/gnuCode.o\
	$(OBJS)/appconf_api.o\
	$(OBJS)/errhndlr.o\
	$(OBJS)/nagpio.o\
    $(OBJS)/narmnvrm.o
else
OBJECTS=\
	$(OBJS)/blram.o\
	$(OBJS)/rommain.o\
	$(OBJS)/reset.o\
	$(OBJS)/nainet.o\
	$(OBJS)/nawait.o\
	$(OBJS)/gnuCode.o\
	$(OBJS)/appconf_api.o\
	$(OBJS)/errhndlr.o\
	$(OBJS)/nagpio.o\
    $(OBJS)/narmnvrm.o
endif

ifeq '$(PLATFORM)' 'ns9750_a'
OBJECTS+=$(BSPOBJS)/memtest.o
endif

ifeq '$(PLATFORM)' 'ns9360_a_eng'
OBJECTS+=$(BSPOBJS)/memtest.o
endif


ifeq '$(PLATFORM)' 'ns9360_a'
OBJECTS+=$(BSPOBJS)/memtest.o
endif

ifeq '$(TOOLSET)' 'arm'
NETOS_CUST_OBJS = $(NETOS_BSPLIBPATH)/reset.o
endif

# list of C files used to generate dependencies
CFILES=$(BLROM_DIR)/rommain.c\
	$(BOOTLOADER_DIR)/nainet.c\
	$(BOOTLOADER_DIR)/nawait.c\
	$(BOOTLOADER_DIR)/gnuCode.c\
	$(BSP_DIR)/appconf_api.c\
	$(BSP_CUSTOMIZE_DIR)/errhndlr.c\
	$(COMMON_GPIO)/nagpio.c\
    $(COMMON_NVRAM)/narmnvrm.c

# Array containg the bootloader RAM image.
SFILES=/../ramImage/blram.s

# linker options
ifeq '$(TOOLSET)' 'arm'
LINKOPT= --info totals --info unused --entry __vectors --scanlib --scatter $(LINK_CMD)
RAMLINKOPT= $(ENDIAN) -nostartfiles
else
LINKOPT= -mbig-endian -nostartfiles $(CPU_FLAG) -mfpu=softfpa
RAMLINKOPT= -mbig-endian -nostartfiles $(CPU_FLAG) 
endif

# linker command file
ifeq '$(TOOLSET)' 'arm'
LINK_CMD=$(PLATFORMS_DIR)/$(PLATFORM)/blrom.txt
#LINK_CMD_SOURCE=./../../init/$(CPU)/blrom.ldr
LINK_CUSTOMIZE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr
else
LINK_CMD=$(PLATFORMS_DIR)/$(PLATFORM)/blrom.ld
LINK_CMD_SOURCE=./../../init/$(CPU)/blrom.ldr
LINK_CUSTOMIZE=$(PLATFORMS_DIR)/$(PLATFORM)/customize.ldr
endif

# Header config file
HEADER_CONFIG=config

# make file
MAKEFILE=Makefile

# output file name(s)
ifeq '$(TOOLSET)' 'arm'
DEBUG_VERSION=rom.axf
else
DEBUG_VERSION=rom.elf
endif
ROM_IMAGE=$(PLATFORMS_DIR)/$(PLATFORM)/rom.bin
SYMFILE=rom.sym
MAPFILE=rom.map
DEPEND=depend.mk


# goal(s)
all: $(ROM_IMAGE) $(OBJECTS) $(OBJS)

# generate dependencies
$(DEPEND): $(CFILES) $(MAKEFILE)
	$(CC) $(INC) $(CCFLAGS) -M $(CFILES) > $(DEPEND)


# rules begins
$(OBJS)/%.o: %.c
	mkdir -p $(OBJS)
	@echo Compiling $<
	$(CC) -c $(INC) $(CCFLAGS) $< -o $@
#	$(CC) -c $(SRCDIR) $(INC) $(CCFLAGS) $< -o $@

ifeq '$(TOOLSET)' 'arm'
# .arm files are preprocessed by the C compilier
$(OBJS)/%.s : %.arm
	$(CC) -c $(INC) $(CCFLAGS) -DASSEMBLY $< -o $(basename $@).s1
	armpre $(basename $@).s1 $@
	cp $@ $(basename $@).cpy

# .S files are preprocessed by the C compilier
$(OBJS)/%.s : %.S
	$(CC) -c $(INC) $(CCFLAGS) -DASSEMBLY $< -o $(basename $@).s1
	armpre $(basename $@).s1 $@
	cp $@ $(basename $@).cpy

$(OBJS)/%.o: %.s
	@echo Assembling $<
	mkdir -p $(OBJS)
	$(AS) $(ASFLAG) $(CROSS_ASFLAGS) $(ASDEF) $< -o $@
else
$(OBJS)/%.o: %.s
	@echo Assembling $<
	mkdir -p $(OBJS)
	$(AS) $(ASFLAG) $(ASDEF) $< -o $@
endif

ifeq '$(TOOLSET)' 'arm'
$(DEBUG_VERSION): $(OBJECTS) $(MAKEFILE) 
	$(LD) $(LINKOPT) -o $(DEBUG_VERSION) $(OBJECTS) $(NETOS_CUST_OBJS) $(PLATFORMS_DIR)/$(PLATFORM)/symbols_rom.txt \
	$(BL_LIBS) --map --symbols --list $(MAPFILE) --symdefs $(SYMFILE)
		
TEMP_ROM_IMAGE = temp_rom.bin
BIG2LITTLE = $(NETOS_BIN)/big2little 
$(ROM_IMAGE): $(DEBUG_VERSION) $(NETOS_BSPLIBPATH)/libbsp.a
	$(FE) --bin $(DEBUG_VERSION) --output $(ROM_IMAGE)
#	$(FE) --bin $(DEBUG_VERSION) --output $(TEMP_ROM_IMAGE)
#	$(BIG2LITTLE) $(TEMP_ROM_IMAGE) $(ROM_IMAGE) 
#	$(RM) $(TEMP_ROM_IMAGE)
else
$(DEBUG_VERSION): $(OBJECTS) $(LINK_CMD) $(MAKEFILE) 
	$(CC) -o $(DEBUG_VERSION) $(OBJECTS) $(LINKOPT) -T $(LINK_CMD) $(NETOS_STARTFILE) \
	$(NETOS_LIBS) -Wl,--start-group $(BL_LIBS) $(CLIB) -Wl,--end-group -Wl,-y,malloc,-Map,$(MAPFILE)
	$(NM) -n $(DEBUG_VERSION) > $(SYMFILE)

$(ROM_IMAGE): $(DEBUG_VERSION) $(NETOS_BSPLIBPATH)/libbsp.a
	$(OBJCOPY) -Obinary $(DEBUG_VERSION) $(ROM_IMAGE)
	$(CHECKSIZE) $(LINKER_FILE) $(ROM_IMAGE) BOOTLOADER_SIZE_IN_FLASH

$(LINK_CMD): $(LINK_CMD_SOURCE) $(LINK_CUSTOMIZE)
	$(LS_CPP) $(LINK_CMD_SOURCE) $(LINK_CMD)
endif



# clean up
localclean:
ifeq '$(TOOLSET)' 'arm'
	rm -f $(OBJS)/*.o $(OBJS)/*.d $(OBJS)/*.axf $(OBJS)/*.out $(OBJS)/*.lst\
	$(OBJS)/*.cmd ./*.x ./*.bin ./*.ldr ./*.ld ./*.sym ./*.map ./*.o $(DEBUG_VERSION) $(ROM_IMAGE) $(DEPEND)
else
	rm -f $(OBJS)/*.o $(OBJS)/*.d $(OBJS)/*.elf $(OBJS)/*.out $(OBJS)/*.lst\
	$(OBJS)/*.cmd ./*.x ./*.bin ./*.ldr ./*.ld ./*.sym ./*.map ./*.o $(DEBUG_VERSION) $(ROM_IMAGE) $(DEPEND)
endif

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


#  C include dependencies , added 04/23/02
ifeq '$(TOOLSET)' 'arm'
else
$(OBJS)/reset.o: reset.s
endif
$(OBJS)/blram.o: blram.s

-include $(DEPEND)

