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

##############################################
# Include GNU tools set up
#
include $(BASEDIR)/Makefile.tools
ifeq '$(TOOLSET)' 'arm'
include $(BASEDIR)/Makefile.bld
include $(BASEDIR)/Makefile.inc
endif

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



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

# CPU architecture

# debug flag
DEBUG_FLAG= 

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

# defines/undefines
ifeq '$(TOOLSET)' 'arm'
DEF= -DDOTNETMF -DIAM_ENABLED -DNETOS_ARM_TOOLS -DNET_OS -DNET_WORKS -DNET_OS_SPECIFIC $(CHIP_DEFINES) -D_LITTLE_ENDIAN
else
DEF= -D__GNU__ -DNETOS_GNU_TOOLS -DNET_OS -DNET_WORKS -DNET_OS_SPECIFIC $(CHIP_DEFINES) -DIAM_ENABLED
endif

ifeq "$(STACK)" "treck"
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=1
INC += -I$(BASEDIR)/src/treck/include -I$(BASEDIR)/src/treck/source/ossupport/netos
INC += -I$(BASEDIR)/src/treck/source/ossupport
else
DEF  += -DFUSION=0 -DTRECK=1 -DNETWORK_STACK=0
endif


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

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

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

# final C compiler options
ifeq '$(TOOLSET)' 'arm'
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) $(INC) $(OPTIMIZE) -g $(LANGUAGE_FLAGS)
else
CCFLAGS=$(DEBUG_FLAG) $(BASECFLAG) $(DEF) $(INC) $(OPTIMIZE) -g
endif

DEPEND=depend.mk
LIB=./../libs/$(TOOLSET)/$(PLATFORM)/libnet.a

ifeq ($(BSP_DEF),-DBSP_ARM9)
AS_BSP_DEF=--defsym BSP_ARM9=1
endif

# assembler
ifeq '$(TOOLSET)' 'arm'
ifeq "$(RVDS_VER)" "3.0"
ASFLAG= -g --cpu=ARM9TDMI --ARM --apcs /adsabi
else
ASFLAG= -g --cpu=ARM9TDMI --ARM 
endif
else
ASFLAG= -EB -mfpu=softfpa $(CPU_FLAG) 
endif


OBJ_DIR=./objs/$(TOOLSET)/$(PLATFORM)

# objects to be linked
ifeq '$(TOOLSET)' 'arm'
OBJECTS=$(OBJ_DIR)/armeth.o\
	$(OBJ_DIR)/ethreset.o\
	$(OBJ_DIR)/arp.o\
	$(OBJ_DIR)/ethernet.o\
	$(OBJ_DIR)/icmp.o\
	$(OBJ_DIR)/ip.o\
	$(OBJ_DIR)/log.o\
	$(OBJ_DIR)/blDhcp.o\
	$(OBJ_DIR)/narmbase.o\
	$(OBJ_DIR)/packet.o\
	$(OBJ_DIR)/tftpc.o\
	$(OBJ_DIR)/timer.o\
	$(OBJ_DIR)/udp.o \
	$(OBJ_DIR)/retarget.o
else
OBJECTS=$(OBJ_DIR)/armeth.o\
	$(OBJ_DIR)/ethreset.o\
	$(OBJ_DIR)/arp.o\
	$(OBJ_DIR)/ethernet.o\
	$(OBJ_DIR)/icmp.o\
	$(OBJ_DIR)/ip.o\
	$(OBJ_DIR)/log.o\
	$(OBJ_DIR)/blDhcp.o\
	$(OBJ_DIR)/narmbase.o\
	$(OBJ_DIR)/packet.o\
	$(OBJ_DIR)/tftpc.o\
	$(OBJ_DIR)/timer.o\
	$(OBJ_DIR)/udp.o
endif

ifeq '$(CPU)' 'arm9'
OBJECTS+=$(OBJ_DIR)/arm9_isr.o\
	$(OBJ_DIR)/blIRQ.o
endif

#Source paths
NET_DIR=.

# List of C files used to generate dependencies
CFILES=$(NET_DIR)/armeth.c\
	$(NET_DIR)/ethreset.c\
	$(NET_DIR)/arp.c\
	$(NET_DIR)/ethernet.c\
	$(NET_DIR)/icmp.c\
	$(NET_DIR)/ip.c\
	$(NET_DIR)/log.c\
	$(NET_DIR)/narmbase.c\
	$(NET_DIR)/packet.c\
	$(NET_DIR)/tftpc.c\
	$(NET_DIR)/timer.c\
	$(NET_DIR)/udp.c

ifeq '$(CPU)' 'arm9'
CFILES+=$(NET_DIR)/blIRQ.c
endif

$(OBJ_DIR)/%.o: %.c
	$(CC) -c $(CCFLAGS) $< -o $@

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

# .S files are preprocessed by the C compilier
$(OBJ_DIR)/%.s : %.S
	$(CC) -c $(CFLAGS) -DASSEMBLY $(CC_ARM_FLAGS) $(INCDIRS) $< -o $(basename $@).s1
	armpre $(basename $@).s1 $@
	cp $@ $(basename $@).cpy
else
$(OBJ_DIR)/%.o: %.s
	$(AS) $(ASFLAG) $(AS_BSP_DEF) $< -o $@
endif

# goal(s)
all: $(OBJ_DIR) $(LIB) 

.PHONY: $(OBJ_DIR)
$(OBJ_DIR):
	mkdir -p $(OBJ_DIR)

$(LIB): $(OBJECTS)
	$(AR) -r $(LIB) $(OBJECTS)

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

# clean up
localclean:
	rm -f $(OBJ_DIR)/*.*

# header dep.
-include $(DEPEND)

