# EPOS-- Makefile Definitions

# Supported software architectures
MODE_KERNEL	:= kernel
MODE_BUILTIN	:= builtin
MODE_LIBRARY	:= library

# Supported hardware architectures
ARCH_IA32	:= ia32
ARCH_AVR8       := avr8
ARCH_PPC32      := ppc32

# Supported machines
MACH_PC		:= pc
MACH_ATMEGA16  	:= atmega16
MACH_ATMEGA128 	:= atmega128
MACH_ML310      := ml310

# System configuration
MODE		:= $(MODE_LIBRARY)
ARCH		:= $(ARCH_IA32)
MACH		:= $(MACH_PC)

# do not modify anything bellow this line
###############################################################################

# Compiler prefixes
$(ARCH_IA32)_COMP_PREFIX	:= $(HOME)/usr/local/ia32/gcc/bin/ia32-
#$(ARCH_IA32)_COMP_PREFIX	:= $(HOME)/usr/local/i686-elf/bin/i686-elf-
$(ARCH_AVR8)_COMP_PREFIX	:= /usr/local/avr/gcc.testing/bin/avr-
$(ARCH_PPC32)_COMP_PREFIX       := /usr/local/ppc32/gcc/bin/ppc32-
COMP_PREFIX			:= $($(ARCH)_COMP_PREFIX)

# Boot memory maps
$(MACH_PC)_MEM_BASE       	     := 0x00000000
$(MACH_PC)_MEM_TOP       	     := 0x02000000
$(MACH_PC)_BOOT_ADDR       	     := 0x00007c00
$(MACH_PC)_SETUP_ADDR      	     := 0x00100000
$(MACH_PC)_INIT_ADDR       	     := 0x00200000
$(MACH_PC)_SYS_CODE_ADDR	     := 0x1f700000
$(MACH_PC)_SYS_DATA_ADDR	     := 0x1f740000
$(MACH_PC)_APP_CODE_ADDR	     := 0x00008000
$(MACH_PC)_APP_DATA_ADDR	     := 0x00400000
$(MACH_PC)_BOOT_LENGTH_MIN           := 128
$(MACH_PC)_BOOT_LENGTH_MAX           := 512
$(MACH_ATMEGA16)_MEM_BASE	     := 0x00800060
$(MACH_ATMEGA16)_MEM_TOP     	     := 0x00800460
$(MACH_ATMEGA16)_BOOT_ADDR     	     := 0x00000000
$(MACH_ATMEGA16)_SETUP_ADDR    	     := 0x00000000
$(MACH_ATMEGA16)_INIT_ADDR     	     := 0x00000000
$(MACH_ATMEGA16)_SYS_CODE_ADDR	     := 0x00000000
$(MACH_ATMEGA16)_SYS_DATA_ADDR	     := 0x00800110
$(MACH_ATMEGA16)_APP_CODE_ADDR	     := 0x00000000
$(MACH_ATMEGA16)_APP_DATA_ADDR	     := 0x00800110
$(MACH_ATMEGA16)_BOOT_LENGTH_MIN     := 128
$(MACH_ATMEGA16)_BOOT_LENGTH_MAX     := 512
$(MACH_ATMEGA128)_MEM_BASE     	     := 0x00800100
$(MACH_ATMEGA128)_MEM_TOP     	     := 0x00801100
$(MACH_ATMEGA128)_BOOT_ADDR    	     := 0x00000000
$(MACH_ATMEGA128)_SETUP_ADDR   	     := 0x00000000
$(MACH_ATMEGA128)_INIT_ADDR    	     := 0x00000000
$(MACH_ATMEGA128)_SYS_CODE_ADDR	     := 0x00000000
$(MACH_ATMEGA128)_SYS_DATA_ADDR	     := 0x00800150
$(MACH_ATMEGA128)_APP_CODE_ADDR	     := 0x00000000
$(MACH_ATMEGA128)_APP_DATA_ADDR	     := 0x00800150
$(MACH_ATMEGA128)_BOOT_LENGTH_MIN    := 128
$(MACH_ATMEGA128)_BOOT_LENGTH_MAX    := 512
$(MACH_ML310)_MEM_BASE               := 0x00000000
$(MACH_ML310)_MEM_TOP                := 0x04000000
$(MACH_ML310)_BOOT_ADDR              := 0x00000000
$(MACH_ML310)_SETUP_ADDR             := 0x00600000
$(MACH_ML310)_INIT_ADDR              := 0x00000000
$(MACH_ML310)_SYS_CODE_ADDR          := 0x03800000
$(MACH_ML310)_SYS_DATA_ADDR          := 0x03C00000
$(MACH_ML310)_APP_CODE_ADDR          := 0x00000000
$(MACH_ML310)_APP_DATA_ADDR          := 0x00200000
$(MACH_ML310)_BOOT_LENGTH_MIN        := 9216
$(MACH_ML310)_BOOT_LENGTH_MAX        := 9216
BOOT_ADDR			     = $($(MACH)_BOOT_ADDR)
SETUP_ADDR			     = $($(MACH)_SETUP_ADDR)
INIT_ADDR			     = $($(MACH)_INIT_ADDR)
SYS_CODE_ADDR			     = $($(MACH)_SYS_CODE_ADDR)
SYS_DATA_ADDR			     = $($(MACH)_SYS_DATA_ADDR)
APP_CODE_ADDR			     = $($(MACH)_APP_CODE_ADDR)
APP_DATA_ADDR			     = $($(MACH)_APP_DATA_ADDR)
MEM_BASE			     = $($(MACH)_MEM_BASE)
MEM_TOP				     = $($(MACH)_MEM_TOP)
BOOT_LENGTH_MIN       		     = $($(MACH)_BOOT_LENGTH_MIN)
BOOT_LENGTH_MAX        		     = $($(MACH)_BOOT_LENGTH_MAX)

#Machine specifics
$(MACH_PC)_CC_FLAGS		:=
$(MACH_PC)_AS_FLAGS		:=
$(MACH_PC)_LD_FLAGS		:= 
$(MACH_PC)_CODE_NAME		:= .hash
$(MACH_PC)_DATA_NAME		:= .tdata
$(MACH_ATMEGA16)_CC_FLAGS	:= -mmcu=atmega16 -Wno-inline
$(MACH_ATMEGA16)_AS_FLAGS	:= -mmcu=atmega16
$(MACH_ATMEGA16)_LD_FLAGS	:= -m avr5 
$(MACH_ATMEGA16)_CODE_NAME	:= .hash
$(MACH_ATMEGA16)_DATA_NAME	:= .data
$(MACH_ATMEGA128)_CC_FLAGS	:= -mmcu=atmega128 -Wno-inline
$(MACH_ATMEGA128)_AS_FLAGS	:= -mmcu=atmega128
$(MACH_ATMEGA128)_LD_FLAGS	:= -m avr5
$(MACH_ATMEGA128)_CODE_NAME	:= .hash
$(MACH_ATMEGA128)_DATA_NAME	:= .data
$(MACH_ML310)_CC_FLAGS          := -mcpu=405 -Wa,-m405 -mstrict-align
$(MACH_ML310)_AS_FLAGS          :=
$(MACH_ML310)_LD_FLAGS          :=
$(MACH_ML310)_CODE_NAME		:= .hash
$(MACH_ML310)_DATA_NAME		:= .tdata
MACH_CC_FLAGS			:= $($(MACH)_CC_FLAGS)
MACH_AS_FLAGS			:= $($(MACH)_AS_FLAGS)
MACH_LD_FLAGS			:= $($(MACH)_LD_FLAGS)
MACH_CODE_NAME			:= $($(MACH)_CODE_NAME)
MACH_DATA_NAME			:= $($(MACH)_DATA_NAME)

# Architecture specifics
$(ARCH_IA32)_WORD_SIZE	:= 32
$(ARCH_IA32)_ENDIANESS	:= little
$(ARCH_IA32)_CLOCK	:= 2000000000
$(ARCH_AVR8)_WORD_SIZE	:= 8
$(ARCH_AVR8)_ENDIANESS	:= little
$(ARCH_AVR8)_CLOCK	:= 4000000
$(ARCH_PPC32)_WORD_SIZE := 32
$(ARCH_PPC32)_ENDIANESS := big
$(ARCH_PPC32)_CLOCK     := 300000000
ARCH_WORD_SIZE		:= $($(ARCH)_WORD_SIZE)
ARCH_ENDIANESS		:= $($(ARCH)_ENDIANESS)
ARCH_CLOCK		:= $($(ARCH)_CLOCK)
CONF_FLAGS		:= -D __$(ARCH) -D __$(MACH)

# Paths, prefixes and suffixes
INCLUDE		= $(EPOS)/include
SRC		= $(EPOS)/src
APP		= $(EPOS)/app
BIN		= $(EPOS)/bin
LIB		= $(EPOS)/lib
IMG		= $(EPOS)/img
CFG		= $(EPOS)/cfg
DOC		= $(EPOS)/doc
LSYSNAME	= system
LINITNAME	= init
LUTILNAME	= util
LEHNAME 	= eh
LIBSYS		= $(LIB)/lib$(LSYSNAME)_$(ARCH).a
LIBINIT		= $(LIB)/lib$(LINITNAME)_$(ARCH).a
LIBUTIL		= $(LIB)/lib$(LUTILNAME)_$(ARCH).a
LIBEH		= $(LIB)/lib$(LEHNAME)_$(ARCH).a
LSYS		= $(LSYSNAME)_$(ARCH)
LINIT		= $(LINITNAME)_$(ARCH)
LUTIL		= $(LUTILNAME)_$(ARCH)
LEH		= $(LEHNAME)_$(ARCH)
ifndef APPLICATION
APPLICATION 	= $(MACH)_app
endif

# Tools to adapt linux files
SED 		= sed

# Tools and flags to compile system tools
TCC		= gcc -ansi -c
TCCFLAGS	= -Wall -O2 -I$(INCLUDE) $(CONF_FLAGS)

TCXX		= g++ -c -ansi -fno-exceptions
TCXXFLAGS	= -Wall -O2 -I$(INCLUDE) $(CONF_FLAGS)

TCPP		= gcc -E 
TCPPFLAGS	= -I$(INCLUDE) $(CONF_FLAGS)

TLD		= gcc
TLDFLAGS	= 

# Tools and flags to compile applications
ACC		= eposcc $(MACH_CC_FLAGS) -c -ansi -O2 $(CONF_FLAGS)
ACXX		= eposcc $(MACH_CC_FLAGS) -c -ansi -O2 $(CONF_FLAGS)
AF77		= eposcc $(MACH_CC_FLAGS) -c -ansi -O2 $(CONF_FLAGS)
ALD		= eposcc --$(MODE) $(MACH_LD_FLAGS)
ALDFLAGS	= 

# Tools and flags to compile the system
AR		= $(COMP_PREFIX)ar
ARFLAGS		= rcs

AS		= $(COMP_PREFIX)as
ASFLAGS		= $(MACH_AS_FLAGS)

CC		= $(COMP_PREFIX)gcc -ansi -c
CCFLAGS		= $(MACH_CC_FLAGS) -O2 -nostdinc -Wall -I$(INCLUDE) $(CONF_FLAGS)
CCLIB		= `$(CC) $(MACH_CC_FLAGS) -print-file-name=`

CPP		= $(COMP_PREFIX)gcc -E
CPPFLAGS	= $(MACH_CC_FLAGS) -I$(INCLUDE) $(CONF_FLAGS)

#CXX		= $(COMP_PREFIX)g++ -c --no-exceptions --no-rtti --no-use-cxa-atexit
CXX		= $(COMP_PREFIX)g++ -c --no-rtti --no-use-cxa-atexit
CXXFLAGS	= $(MACH_CC_FLAGS) -O2 -nostdinc -Wall -I$(INCLUDE) $(CONF_FLAGS)

LD		= $(COMP_PREFIX)ld -l$(LEH)
LDFLAGS		= $(MACH_LD_FLAGS) -L$(LIB) -Bstatic

OBJCPY          = $(COMP_PREFIX)objcopy
OBJCPYFLAGS     =

MAKE		= make
MAKEALL		= make all
MAKEINSTALL	= make install
MAKECLEAN	= make -i clean
MAKETEST	= make test
MAKEPRINT	= make print
#MAKEFLAGS	= -r --no-print-directory -s
MAKEFLAGS	= -r 

MKBI		= eposmkbi

DD		= dd

STRIP		= $(COMP_PREFIX)strip -R .note -R .comment

INSTALL		= cp

SHELL		= tcsh

PRINT		= a2ps -2 --medium=A4 --tabsize=8 --landscape --pretty-print=cpp --borders=off --header --left-footer --footer --right-footer

CLEAN		= rm -f
CLEANDIR	= rm -rf

RET2IRET	= sed -e 's/ret/iret/'

TOUCH		= touch


# Rules
lib%.o:		lib%.cc
		$(CXX) $(CXXFLAGS) $<

%_test.o:	%_test.cc
		$(ACXX) $(ACXXFLAGS) $<

%_test.o:	%_test.c
		$(ACC) $(ACCFLAGS) $<

%_test:		%_test.o
		$(ALD) $(ALDFLAGS) $< -o $@
		$(STRIP) $@ -o $(IMG)/$@
#		$(MKBI) $(MKBI_IMG) $(IMG)/$@

%.o:		%.cc
		$(CXX) $(CXXFLAGS) $<

%.o:		%.c
		$(CC) $(CCFLAGS) $<

%.s:		%.S
		$(CPP) $(CPPFLAGS) $< -o $@

%.o:		%.s
		$(AS) $(ASFLAGS) $< -o $@

%:		%.cc
		$(CXX) $(CXXFLAGS) $<
		$(LD) $(LDFLAGS) %@.o -o $@

%:		%.c
		$(CC) $(CCFLAGS) $<
		$(LD) $(LDFLAGS) %@.o -o $@

(%.o):		%.o
		$(AR) $(ARFLAGS) $@ $^

%.key:		%.cc
		$(EPOSANL) $< 

%.key:		%.c
		$(EPOSANL) $<

.PRECIOUS:	%.o
