#**************************************************************************
#                                                                         *
#   PROJECT     : ARM port for uC/OS-II                                   *
#                                                                         *
#   MODULE      : MAKEFILE                                                *
#                                                                         *
#   AUTHOR      : Michael Anburaj                                         *
#                 URL  : http://geocities.com/michaelanburaj/             *
#                 EMAIL: michaelanburaj@hotmail.com                       *
#                                                                         *
#   SPONSOR     : Thanks to Martin Li for sponsoring hardware for this    *
#                 work.                                                   *
#                 EMAIL: mli00@yahoo.com                                  *
#                                                                         *
#   PROCESSOR   : LPC210x (32 bit ARM7TDMI-S RISC core from Philips)      *
#                                                                         *
#   TOOL-CHAIN  : GCC                                                     *
#                                                                         *
#   DESCRIPTION :                                                         *
#   Make file for Ex1 ARM_UCOS builds. Use GNU's make utility to          *
#   build using this file.                                                *
#                                                                         *
#*************************************************************************/


#**************************************************************************
#* Build Configuration
#**************************************************************************

#### Project name ####
PRJ = ex1

#### Endian ####
# possible values: EL (for Little), little endian only
ENDIAN = EL

#### Debug ####
# possible values: 0, 1
DEBUG = 0

#### Target Mode ####
# Possible values: 0 (for arm), 1 (for armthumb)
TARGET = 1

#### Development platform ####
# possible values: 0 (for Win), 1 (for Linux)
DEVPLF = 0

#### ARM tool Definition ####
CC        = arm-elf-gcc
LD        = arm-elf-ld
OBJCOPY   = arm-elf-objcopy
OBJDUMP   = arm-elf-objdump

RM        = rm -f

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

ROOT      = ./../..
UCOSROOT  = ./../../..
AUP_COMMONROOT = $(UCOSROOT)/arm_ucos/common
AUP_LPCROOT  = $(UCOSROOT)/arm_ucos/lpc210x
SRCDIR    = $(ROOT)/src $(AUP_COMMONROOT)/src $(AUP_COMMONROOT)/src/gcc $(AUP_LPCROOT)/src $(AUP_LPCROOT)/src/gcc
INCDIR    = $(ROOT)/inc
BINDIR    = $(ROOT)/bin
LINKDIR   = $(AUP_LPCROOT)/bin/gcc/

VPATH     = $(SRCDIR)


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

IMAGE_ELF_ROM = $(PRJ)_rom.elf
IMAGE_HEX_ROM = $(PRJ)_rom.hex
MAP_ROM       = $(PRJ)_rom.map
IMAGE_ELF_RAM = $(PRJ)_ram.elf
IMAGE_HEX_RAM = $(PRJ)_ram.hex
IMAGE_SREC_RAM= $(PRJ)_ram.rec
MAP_RAM       = $(PRJ)_ram.map

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

INCLUDE   = -I$(INCDIR) -I$(AUP_COMMONROOT)/inc -I$(AUP_LPCROOT)/inc -I$(UCOSROOT)/SOURCE

#THUMB_IW = -mthumb-interwork

CPU       = arm7tdmi
W_OPTS    = -Wall -Wcast-align -Wcast-qual -Wimplicit -Wmissing-declarations \
            -Wmissing-prototypes -Wnested-externs -Wpointer-arith -Wswitch \
            -Wredundant-decls -Wreturn-type -Wshadow -Wstrict-prototypes -Wunused
OPTS      = -mcpu=$(CPU) $(THUMB_IW)
CA_OPTS   = $(OPTS) -g -c $(INCLUDE) -D$(ENDIAN) -DGCC
CC_OPTS   = $(CA_OPTS) -O2 $(W_OPTS)
CC_OPTS_A = $(CA_OPTS) -D_ASSEMBLER_ -x assembler-with-cpp

LD_SCRIPT_ROM = $(LINKDIR)/link_rom.ld
LD_SCRIPT_RAM = $(LINKDIR)/link_ram.ld
LD_OPTS_ROM   = $(OPTS) -nostartfiles -T $(LD_SCRIPT_ROM) -o $(IMAGE_ELF_ROM) -Wl,-Map=$(MAP_ROM),--cref
LD_OPTS_RAM   = $(OPTS) -nostartfiles -T $(LD_SCRIPT_RAM) -o $(IMAGE_ELF_RAM) -Wl,-Map=$(MAP_RAM),--cref

# **********************************************
# 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_HEX_ROM) $(IMAGE_HEX_RAM) $(IMAGE_SREC_RAM)

$(IMAGE_HEX_ROM) : $(IMAGE_ELF_ROM)
	$(OBJCOPY) -O ihex $(IMAGE_ELF_ROM) $(IMAGE_HEX_ROM)

$(IMAGE_HEX_RAM) : $(IMAGE_ELF_RAM)
	$(OBJCOPY) -O ihex $(IMAGE_ELF_RAM) $(IMAGE_HEX_RAM)

$(IMAGE_SREC_RAM): $(IMAGE_ELF_RAM)
	$(OBJCOPY) -O srec $(IMAGE_ELF_RAM) $(IMAGE_SREC_RAM)


$(IMAGE_ELF_ROM) : $(OBJ) $(LD_SCRIPT_ROM)
	$(CC) $(OBJ) $(LD_OPTS_ROM)

$(IMAGE_ELF_RAM) : $(OBJ) $(LD_SCRIPT_RAM)
	$(CC) $(OBJ) $(LD_OPTS_RAM)


$(OBJ_C) : %.o : %.c 
	$(CC) $(CC_OPTS) -o $@ $<

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

$(OBJ) : ./makefile

.PHONY : clean depend

clean :
	$(RM) *.o
	$(RM) *.map
	$(RM) *.elf
	$(RM) *.hex
	$(RM) *.rec

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


-include depend.mk

#**************************************************************************
#* End
#**************************************************************************
