#**************************************************************************
#                                                                         *
#   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.                                                      *
#                                                                         *
#*************************************************************************/


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

# linux or win
DEVPLF    = linux

# cygnus or sde
TOOLCHAIN = cygnus

# Name of application
IMAGENAME = ex1

# EL or EB
ENDIAN    = EL

# Debug option, 1 or 0
DEBUG     = 0


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

ifeq ($(TOOLCHAIN),cygnus)
CC        = mipsisa32-elf-gcc
LD        = mipsisa32-elf-ld
OBJCOPY   = mipsisa32-elf-objcopy
OBJDUMP   = mipsisa32-elf-objdump
endif

ifeq ($(TOOLCHAIN),sde)
CC        = sde-gcc
LD        = sde-ld
OBJCOPY   = sde-objcopy
OBJDUMP   = sde-objdump
endif

ifeq ($(DEVPLF),linux)
REMOVEFILE = rm -f
endif

ifeq ($(DEVPLF),win)
REMOVEFILE = del
endif


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

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


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

ROOT      = ./..
UCOSROOT  = ./../..
LIBROOT   = $(UCOSROOT)/mips_ucos/lib
MUP_COMMONROOT = $(UCOSROOT)/mips_ucos/common
MUP_ATLASROOT  = $(UCOSROOT)/mips_ucos/atlas
SRCDIR    = $(ROOT)/src $(MUP_COMMONROOT)/src $(MUP_ATLASROOT)/src $(LIBROOT)/src
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_REC = $(IMAGENAME).rec
MAP       = $(IMAGENAME).map


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

INCLUDE   = -I$(INCDIR) -I$(MUP_COMMONROOT)/inc -I$(MUP_ATLASROOT)/inc -I$(UCOSROOT)/source -I$(LIBINCDIR)

W_OPTS    = -Wimplicit -Wformat
#CC_OPTS   = -g -c -O2 -$(ENDIAN) $(INCLUDE) -D$(ENDIAN) -mips32 $(W_OPTS) 
CC_OPTS   = -g -c -O2 -$(ENDIAN) $(INCLUDE) -D$(ENDIAN) -mips32 -fno-builtin $(W_OPTS)

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

LD_SCRIPT = $(ROOT)/bin/link/link.xn
# earlier it was -oformat instead of --oformat
LD_OPTS   = -g -T $(LD_SCRIPT) -o $(IMAGE_ELF) -Map $(MAP) --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_REC) : $(IMAGE_ELF)
	$(OBJCOPY) -O srec $(IMAGE_ELF) $(IMAGE_REC)

$(IMAGE_ELF) : $(OBJ)
	$(LD) $(LD_OPTS) $(OBJ)

$(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 :
	$(REMOVEFILE) *.o
	$(REMOVEFILE) *.map
	$(REMOVEFILE) *.elf
	$(REMOVEFILE) *.rec


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


-include depend.mk
