#**************************************************************************
#                                                                         *
#   PROJECT     : MIPS port for uC/OS-II                                  *
#                                                                         *
#   MODULE      : MakeFile                                                *
#                                                                         *
#   AUTHOR      : Michael Anburaj                                         *
#                 URL  : http://geocities.com/michaelanburaj/             *
#                 EMAIL: michaelanburaj@hotmail.com                       *
#                                                                         *
#   PROCESSOR   : MIPS 4Kc (32 bit RISC) - ATLAS board                    *
#                                                                         *
#   TOOL-CHAIN  : SDE & Cygnus                                            *
#                                                                         *
#   DESCRIPTION :                                                         *
#   Make file for Ex1 MIPS_UCOS build. Use GNU's make utility to build    *
#   using this file.                                                      *
#                                                                         *
#*************************************************************************/




MODULE_CONFIG=./../../include/module_config.h
CONFIG_MK=./../../config.mk

# -----------------------------
config:
	@echo "#ifndef _MODULE_CONFIG_H_">$(MODULE_CONFIG);\
	echo "#define _MODULE_CONFIG_H_">>$(MODULE_CONFIG);\
	if [ "$$(grep "CONFIG_LWIP=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_LWIP">>$(MODULE_CONFIG); \
		echo "select LWIP"; \
	fi; \
	if [ "$$(grep "CONFIG_GMAC=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_GMAC">>$(MODULE_CONFIG); \
		echo "select GMAC";\
	fi; \
	if [ "$$(grep "CONFIG_FATFS=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_FATFS">>$(MODULE_CONFIG); \
		echo "select FATFS";\
	fi; \
	if [ "$$(grep "CONFIG_NORFLASH=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_NORFLASH">>$(MODULE_CONFIG); \
		echo "select NORFLASH";\
	fi; \
	if [ "$$(grep "CONFIG_NANDFLASH=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_NANDFLASH">>$(MODULE_CONFIG); \
		echo "select NANDFLASH";\
	fi; \
	if [ "$$(grep "CONFIG_SDCARD=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_SDCARD">>$(MODULE_CONFIG); \
		echo "select SDCARD";\
	fi; \
	if [ "$$(grep "CONFIG_UCGUI=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_UCGUI">>$(MODULE_CONFIG); \
		echo "select UCGUI";\
	fi; \
	if [ "$$(grep "CONFIG_TOUCH=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_TOUCH">>$(MODULE_CONFIG); \
		echo "select TOUCH";\
	fi; \
	if [ "$$(grep "CONFIG_LCD=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_LCD">>$(MODULE_CONFIG); \
		echo "select LCD";\
	fi; \
	if [ "$$(grep "CONFIG_USB_EHCI=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_USB_EHCI">>$(MODULE_CONFIG); \
		echo "select USB EHCI";\
	fi;\
	if [ "$$(grep "CONFIG_AC97=1" $(CONFIG_MK))" ] ; then \
		echo "#define CONFIG_AC97">>$(MODULE_CONFIG); \
		echo "select AC97";\
	fi;\
	echo "#endif /* _MODULE_CONFIG_H_ */">>$(MODULE_CONFIG)
include $(CONFIG_MK)

# **********************************************
# Config
# **********************************************

# linux or win
DEVPLF    = linux

# cygnus or sde
TOOLCHAIN = cygnus

# Name of application
IMAGENAME = ucos-ls1b

# EL or EB
ENDIAN    = EL

# Debug option, 1 or 0
DEBUG     = 0


# **********************************************
# Tools
# **********************************************


CC        = mipsel-linux-gcc
LD        = mipsel-linux-ld
OBJCOPY   = mipsel-linux-objcopy
OBJDUMP   = mipsel-linux-objdump
STRIP     = mipsel-linux-strip




# **********************************************
# Endianness format
# **********************************************

ifeq ($(ENDIAN),EL)
OFORMAT = elf32-littlemips
else
OFORMAT = elf32-bigmips
endif


# **********************************************
# Directories
# **********************************************

ROOT           = ./..
UCOSROOT       = ./../..
LIBROOT        = $(UCOSROOT)/lib
UCOS_MIPS      = $(UCOSROOT)/mips
LS1B           = $(UCOSROOT)/ls1b
UCOSSR	       = $(UCOSROOT)/source
LWIP 	       = $(UCOSROOT)/lwip
LWIP_SRC       = $(LWIP)/src
LWIP_PORT      = $(LWIP)/port
DRIVER	       = $(UCOSROOT)/driver
GMAC	       = $(DRIVER)/gmac
NANDFLASH      = $(DRIVER)/nandflash
LCD            = $(DRIVER)/lcd
APP	       = $(UCOSROOT)/app
CMD	       = $(UCOSROOT)/cmds
FATFS          = $(UCOSROOT)/fatfs/src
UCGUI          = $(UCOSROOT)/ucgui
USB-EHCI       = $(DRIVER)/usb-ehci
ADS7846        = $(DRIVER)/ads7846
SPIFLASH       = $(DRIVER)/spiflash
AC97           = $(DRIVER)/ac97
SD             = $(DRIVER)/sd



SRCDIR    = $(UCOS_MIPS) $(LS1B) $(LIBROOT)/src $(APP) $(CMD) $(DRIVER) $(LIBROOT)/src/libm $(APP)/GUIDemo \
	    $(APP)/Application
ifeq ($(CONFIG_LWIP),1)
SRCDIR += $(LWIP_PORT)/netif $(LWIP_PORT)
endif
ifeq ($(CONFIG_NANDFLASH),1)
SRCDIR += $(NANDFLASH)
endif
ifeq ($(CONFIG_LCD),1)
SRCDIR += $(LCD)
endif
ifeq ($(CONFIG_GMAC),1)
SRCDIR += $(GMAC)
endif
ifeq ($(CONFIG_FATFS), 1)
SRCDIR += $(FATFS)
endif
ifeq ($(CONFIG_UCGUI),1)
SRCDIR += $(UCGUI) $(UCGUI)/GUI/AntiAlias  $(UCGUI)/GUI/ConvertColor $(UCGUI)/GUI/ConvertMono \
	  $(UCGUI)/GUI/Core $(UCGUI)/GUI/Font $(UCGUI)/GUI/JPEG $(UCGUI)/GUI/LCDDriver $(UCGUI)/GUI/MemDev\
	  $(UCGUI)/GUI/MultiLayer $(UCGUI)/GUI/Widget $(UCGUI)/GUI/WM
endif
ifeq ($(CONFIG_USB_EHCI),1)
SRCDIR += $(USB-EHCI)
endif
ifeq ($(CONFIG_TOUCH),1)
SRCDIR += $(ADS7846)
endif
ifeq ($(CONFIG_NORFLASH),1)
SRCDIR += $(SPIFLASH)
endif
ifeq ($(CONFIG_SDCARD),1)
SRCDIR += $(SD)
endif
ifeq ($(CONFIG_AC97),1)
SRCDIR += $(AC97)
endif


#INCDIR    = $(ROOT)/inc
BINDIR    = $(ROOT)/bin
LINKDIR   = $(BINDIR)/link
LIBINCDIR = $(LIBROOT)/inc

VPATH     = $(SRCDIR)


# **********************************************
# Image file names and map file
# **********************************************

IMAGE_ELF = $(IMAGENAME).elf
IMAGE_BIN = $(IMAGENAME).bin
IMAGE_REC = $(IMAGENAME).rec
MAP       = $(IMAGENAME).map


# **********************************************
# Compiler and linker options
# **********************************************

INCLUDE   = -I$(UCOSROOT)/include -I$(UCOSROOT)/include/mips -I$(UCOSROOT)/include/ls1b \
            -I$(UCOSROOT)/source -I$(LIBINCDIR) -I$(APP) -I$(CMD) -I$(DRIVER) -I$(APP)/GUIDemo

ifeq ($(CONFIG_LWIP),1)
INCLUDE += -I$(LWIP_SRC)/include -I$(LWIP_SRC)/include/ipv4 -I$(LWIP_SRC)/core -I$(LWIP_SRC) \
	   -I$(LWIP_PORT)/include
endif
ifeq ($(CONFIG_NANDFLASH),1)
INCLUDE += -I$(NANDFLASH)
endif
ifeq ($(CONFIG_LCD),1)
INCLUDE += -I$(LCD)
endif
ifeq ($(CONFIG_GMAC),1)
INCLUDE += -I$(GMAC)
endif
ifeq ($(CONFIG_FATFS),1)
INCLUDE += -I$(FATFS)
endif
ifeq ($(CONFIG_UCGUI),1)
INCLUDE += -I$(UCGUI)/Config -I$(UCGUI)/GUI/Core -I$(UCGUI)/GUI/Widget -I$(UCGUI)/GUI/WM
endif
ifeq ($(CONFIG_NORFLASH),1)
INCLUDE += -I$(SPIFLASH)
endif
ifeq ($(CONFIG_AC97),1)
INCLUDE += -I$(AC97)
endif
ifeq ($(CONFIG_SDCARD),1)
INCLUDE += -I$(SD)
endif
ifeq ($(CONFIG_USB_EHCI),1)
INCLUDE += -I$(USB-EHCI)
endif




W_OPTS    = -Wimplicit -Wformat
#CC_OPTS   = -g -c -O2 -$(ENDIAN) $(INCLUDE) -D$(enterDIAN) -mips32 $(W_OPTS) 
################################################################################
#******注意：编译参数设置不对，会造成启动异常********
#-msoft-float 使用软件浮点
#-ffunction-sections：不用此参数时，.o里代码部分只有.text段；使用此参数，则会使每个函数单独成为一段，
#	比如函数func1()成为.text.func1段，但对链接后代码大小没影响。 
#-fno-pic参数，因为它会使GCC产生非PIC（即位置相关）的代码  mips3 -O2
#-fno-builtin  不接受不是两个下划线开头的内建函数(built-in function).目前受影响的函数有
#	_exit, abort, abs, alloca, cos, exit, fabs, labs, memcmp, memcpy, sin, sqrt, strcmp, strcpy,和strlen.
#################################################################################
CC_OPTS   = -g -c -O2  $(INCLUDE)  -mips32 -fno-builtin \
	   -mno-abicalls -fno-pic  \
	   -fno-exceptions -ffunction-sections \
	   -fomit-frame-pointer -msoft-float 	
# $(W_OPTS)

ifeq ($(TOOLCHAIN),sde)
CC_OPTS_A = $(CC_OPTS) -D_ASSEMBLER_ -D_SDE_
else
CC_OPTS_A = $(CC_OPTS) -D_ASSEMBLER_  -D__ASSEMBLY__ -D_LOCORE
endif

LIBS	:= -lstdc++ -lc -lm -lgcc
LD_SCRIPT = ld.script
# earlier it was -oformat instead of --oformat
LD_OPTS   = -g -nostdlib  -T $(LD_SCRIPT) -o $(IMAGE_ELF)  
# --oformat $(OFORMAT)


# **********************************************
# Files to be compiled
# **********************************************

SRC_C  = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.c))
SRC_S  = $(foreach dir, $(SRCDIR), $(wildcard $(dir)/*.S))
SRC    = $(SRC_C) $(SRC_S)

OBJ_C  = $(notdir $(patsubst %.c, %.o, $(SRC_C)))
OBJ_S  = $(notdir $(patsubst %.S, %.o, $(SRC_S)))
OBJ    = $(OBJ_C) $(OBJ_S)




# **********************************************
# Rules
# **********************************************

.PHONY : all
all : $(IMAGE_REC) $(IMAGE_BIN)

$(IMAGE_REC) : $(IMAGE_ELF)
	$(OBJCOPY) -O srec $(IMAGE_ELF) $(IMAGE_REC)
$(IMAGE_BIN) : $(IMAGE_ELF)
	$(OBJCOPY) -O binary $(IMAGE_ELF) $(IMAGE_BIN)

$(IMAGE_ELF) : $(OBJ)
	$(CC) $(LD_OPTS) $(HEAD0) $(OBJ) $(LIBS)
	$(STRIP) $(IMAGE_ELF)
$(OBJ_C) : %.o : %.c 
	$(CC) $(CC_OPTS) -o $@ $<

$(OBJ_S) : %.o : %.S
	$(CC) $(CC_OPTS_A) -o $@ $<

$(IMAGE_ELF) : $(LD_SCRIPT)
$(OBJ) : ./Makefile

.PHONY : clean depend

clean :
	rm -rf *.o   *.map  *.rec  *.bin 



depend :
	$(CC) $(INCLUDE) -M $(SRC) > depend.mk


-include depend.mk
