#
#

DESTDIR =
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)

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

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

SHELL =	/bin/sh

CC = @CC@

AS = @AS@
AR = @AR@
LD = @LD@
RANLIB = @RANLIB@

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`

OBJS		= putnum.o unlink.o
CFLAGS		= -g
SCRIPTS		= 

# Here is all of the simulator stuff
SIM_SCRIPTS	=
SIM_LDFLAGS	=
SIM_BSP		= libsim.a
SIM_CRT0	= crt0.o
SIM_OBJS	= syscalls.o
SIM_TEST	= sim-test
SIM_INSTALL	= install-sim

# Here is all of the mon960 stuff
MON_LDFLAGS	=
MON_BSP		= libmon960.a
MON_CRT0	= crt0.o
MON_OBJS	= 
MON_SCRIPTS	= mon960.ld
MON_TEST	=
MON_INSTALL	= install-mon

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

#
# build a test program for each target board. Just trying to get
# it to link is a good test, so we ignore all the errors for now.
#
# all: ${MON_CRT0} ${MON_BSP}
all: ${SIM_CRT0} ${SIM_BSP}

#
# here's where we build the board support packages for each target
#
${SIM_BSP}: ${OBJS} ${SIM_OBJS}
	${AR} ${ARFLAGS} ${SIM_BSP} ${SIM_OBJS} ${OBJS}
	${RANLIB} ${SIM_BSP}

${MON_BSP}: ${OBJS} ${MON_OBJS}
	${AR} ${ARFLAGS} ${MON_BSP} ${MON_OBJS} ${OBJS}
	${RANLIB} ${MON_BSP}

#
# here's where we build the test programs for each target
#
.PHONY: test
test:	${SIM_TEST} ${MVME_TEST} ${EVM_TEST} 

sim-test:	sim-test.x sim-test.dis

sim-test.x:	test.o ${SIM_CRT0} ${SIM_BSP}
	${CC} ${LDFLAGS_FOR_TARGET} -L${objdir} \
	${SIM_CRT0} test.o \
	-o sim-test.x ${LIBS_FOR_TARGET} -lc ${SIM_BSP}

sim-test.dis:	sim-test.x
	${OBJDUMP} -d sim-test.x > sim-test.dis


#
#
#
.c.S:
	${CC} ${CFLAGS_FOR_TARGET} -c $<

simulator.o: simulator.S
sim-crt0.o: sim-crt0.S
mvme-crt0.o: mvme-crt0.S
mvme-exit.o: mvme-exit.S
mvme-inbyte.o: mvme-inbyte.S
mvme-outbyte.o: mvme-outbyte.S

clean mostlyclean:
	rm -f a.out core *.i *.o *-test *.srec *.dis *.x $(SIM_BSP) $(MON_BSP)

distclean maintainer-clean realclean: clean
	rm -f Makefile config.status *~

.PHONY: install info install-info clean-info
install: ${SIM_INSTALL}

install-mon:
	set -e; for x in ${MON_CRT0} ${MON_BSP}; do ${INSTALL_DATA} $$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done
	set -e; for x in ${MON_SCRIPTS}; do ${INSTALL_DATA} ${srcdir}/$$x $(DESTDIR)${tooldir}/lib${MULTISUBDIR}/$$x; done

install-sim:
	set -e; for x in ${SIM_CRT0} ${SIM_BSP} ${SIM_SCRIPTS}; do ${INSTALL_DATA} $$x $(DESTDIR)${tooldir}/lib/$$x; done

doc:
info:
install-info:
clean-info:

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

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