# Copyright (c) 2005,2008 Red Hat Inc
#
# The authors hereby grant permission to use, copy, modify, distribute,
# and license this software and its documentation for any purpose, provided
# that existing copyright notices are retained in all copies and that this
# notice is included verbatim in any distributions. No written agreement,
# license, or royalty fee is required for any of the authorized uses.
# Modifications to this software may be copyrighted by their authors
# and need not follow the licensing terms described here, provided that
# the new terms are clearly indicated on the first page of each file where
# they apply.

# Makefile for libgloss/m32c.

VPATH = @srcdir@
srcdir = @srcdir@
objdir = .
srcroot = $(srcdir)/../..
objroot = $(objdir)/../..

prefix = @prefix@
exec_prefix = @exec_prefix@

host_alias = @host_alias@
target_alias = @target_alias@

bindir = @bindir@
libdir = @libdir@
tooldir = $(exec_prefix)/$(target_alias)

# Multilib support variables.
# TOP is used instead of MULTI{BUILD,SRC}TOP.
MULTIDIRS =
MULTISUBDIR =
MULTIDO = true
MULTICLEAN = true

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@

SHELL = /bin/sh

CC = @CC@

AS = @AS@
AR = @AR@
LD = @LD@
RANLIB = @RANLIB@
AR_FLAGS = rc

OBJDUMP = `if [ -f ${objroot}/../binutils/objdump ] ; \
	then echo ${objroot}/../binutils/objdump ; \
	else t='$(program_transform_name)'; echo objdump | sed -e $$t ; fi`
OBJCOPY = `if [ -f ${objroot}/../binutils/objcopy ] ; \
	then echo ${objroot}/../binutils/objcopy ; \
	else t='$(program_transform_name)'; echo objcopy | sed -e $$t ; fi`

HEADERS = varvects.h
SCRIPTS = r8c.ld m16c.ld m32cm.ld m32c.ld m16cmon.ld m32cmon.ld sim8.ld sim16.ld sim24.ld
CRT = crt0.o crtn.o
SIM_BSP = libsim.a
M32C_BSP = libm32cgloss.a
LIBNOSYS = ../libnosys/libnosys.a
SIM_OBJS = \
	sbrk.o \
	heaptop.o \
	exit.o \
	open.o \
	close.o \
	read.o \
	write.o \
	lseek.o \
	unlink.o \
	getpid.o \
	kill.o \
	fstat.o \
	argvlen.o \
	argv.o \
	chdir.o \
	stat.o \
	chmod.o \
	utime.o \
	time.o \
	gettimeofday.o \
	times.o \
	link.o \
	isatty.o \
	abort.o
M32C_OBJS = \
	varvects.o

#### Host specific Makefile fragment comes in here.
@host_makefile_frag@


# Override .S.o rule to pass assembler debugging flags
.S.o:
	$(CC) -Wa,-gdwarf2 -Wa,-I$(srcdir) $(CFLAGS_FOR_TARGET) $(INCLUDES) $(CFLAGS) -c $<

all: $(CRT) $(SIM_BSP) $(M32C_BSP) $(SCRIPTS)

$(SIM_BSP): $(SIM_OBJS)
	$(AR) $(ARFLAGS) $@ $?
	$(RANLIB) $@

$(M32C_BSP): $(M32C_OBJS)
	$(AR) $(ARFLAGS) $@ $?
	$(RANLIB) $@

# genscript parameters: srcdir name ramstart ramsize romstart romsize vecprefix

GDEP = $(srcdir)/m32c.tmpl $(srcdir)/genscript Makefile
GS = $(SHELL) $(srcdir)/genscript $(srcdir) 

# NOTE: The simulators and monitors reserve the following locations
# for themselves, so we skip them:
#   R8C/M16C:	0x400-0x4ff	0x0ff600-0x0ffcff
#   M32C:	0x400-0x4ff	0xfff600-0xfffcff

r8c.ld : $(GDEP)
	$(GS) r8c   0x500  0x300   0xc000   0x3f24   0xff

m16c.ld : $(GDEP)
	$(GS) m16c  0x500 0x4f00  0xc0000  0x3f600  0xfff

m32cm.ld : $(GDEP)
	$(GS) m32cm 0x500 0x2700 0xfe0000 0x01f600 0xffff

m32c.ld : $(GDEP)
	$(GS) m32c  0x500 0x7b00 0xf80000 0x07f600 0xffff


m16cmon.ld : $(GDEP)
	$(GS) m16cmon  0x400  0x100  0xff600    0x800  0xfff

m32cmon.ld : $(GDEP)
	$(GS) m32cmon  0x400  0x100 0xfff600    0x800 0xffff


sim8.ld : $(GDEP)
	$(GS) sim8  0x500 0xf624        0        0   0xff

sim16.ld : $(GDEP)
	$(GS) sim16 0x500 0xf700  0x20000  0x80000  0xfff

sim24.ld : $(GDEP)
	$(GS) sim24 0x200000 0x800000   0        0 0xffff

# Dependencies

SDEPS = $(srcdir)/m32csys.h $(srcdir)/../syscall.h

abort.o : $(SDEPS)
argv.o : $(SDEPS)
argvlen.o : $(SDEPS)
chdir.o : $(SDEPS)
chmod.o : $(SDEPS)
close.o : $(SDEPS)
exit.o : $(SDEPS)
fstat.o : $(SDEPS)
getpid.o : $(SDEPS)
gettimeofday.o : $(SDEPS)
heaptop.o : $(SDEPS)
kill.o : $(SDEPS)
link.o : $(SDEPS)
lseek.o : $(SDEPS)
open.o : $(SDEPS)
read.o : $(SDEPS)
stat.o : $(SDEPS)
time.o : $(SDEPS)
times.o : $(SDEPS)
unlink.o : $(SDEPS)
utime.o : $(SDEPS)
write.o : $(SDEPS)

install: $(CRT) $(SIM_BSP) $(M32C_BSP) $(SCRIPTS)
	for c in $(CRT) $(SIM_BSP) $(M32C_BSP); do \
	  $(INSTALL_DATA) $$c $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$c ;\
	done
	for c in $(SCRIPTS); do \
	  $(INSTALL_DATA) $$c $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$c ;\
	done
	for c in $(HEADERS); do \
	  $(INSTALL_DATA) ${srcdir}/$$c \
		$(DESTDIR)$(tooldir)/include/$$c ;\
	done

clean mostlyclean:
	rm -f *.o *.a

distclean maintainer-clean realclean: clean
	rm -f Makefile config.cache config.log config.status

.PHONY: info dvi doc install-info clean-info
info doc dvi:
install-info:
clean-info:

Makefile: Makefile.in config.status @host_makefile_frag_path@
	$(SHELL) config.status

config.status: configure
	$(SHELL) config.status --recheck
