# Copyright (c) 1999, 2001, 2003 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/mep.  We only support the simulator at the
# moment.

VPATH = @srcdir@ @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`

SCRIPTS = min.ld default.ld
CRT = crt0.o sdram-crt0.o sim-crt0.o simnovec-crt0.o simsdram-crt0.o crtn.o sim-crtn.o
SIM_BSP = libsim.a
LIBNOSYS = ../libnosys/libnosys.a
SIM_OBJS = \
	isatty.o \
	sbrk.o \
	syscalls.o \
	mep-gmon.o \
	mep-bb.o \
	handlers.o \
	h_reset.o \
	read.o \
	write.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)

$(SIM_BSP): $(SIM_OBJS)
	$(AR) $(ARFLAGS) $@ $?
	$(RANLIB) $@
	$(AR) $(ARFLAGS) $(LIBNOSYS) handlers.o h_reset.o
	$(RANLIB) $(LIBNOSYS)

syscalls.o: $(srcdir)/syscalls.S
sbrk.o: $(srcdir)/sbrk.c
crt0.o: $(srcdir)/crt0.S $(srcdir)/sim-crt0.S
sdram-crt0.o: $(srcdir)/sdram-crt0.S $(srcdir)/sim-crt0.S
sim-crt0.o: $(srcdir)/sim-crt0.S
simsdram-crt0.o: $(srcdir)/simsdram-crt0.S $(srcdir)/sim-crt0.S
simnovec-crt0.o: $(srcdir)/simnovec-crt0.S $(srcdir)/sim-crt0.S
crtn.o: $(srcdir)/crtn.S $(srcdir)/sim-crtn.S

install: $(CRT) $(SIM_BSP)
	for c in $(CRT) $(SIM_BSP); do \
	  $(INSTALL_DATA) $$c $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$c ;\
	done
	if test -z "$(MULTISUBDIR)"; then \
	  for c in $(SCRIPTS); do \
	    $(INSTALL_DATA) $(srcdir)/$$c $(DESTDIR)$(tooldir)/lib${MULTISUBDIR}/$$c ;\
	  done; \
	  $(INSTALL_DATA) $(srcdir)/gmap_default.ld $(DESTDIR)$(tooldir)/lib/gmap_default.tmpl; \
	else true; fi

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
