# Makefile for regression testing the frv simulator.
# Copyright (C) 1998, 2007, 2008 Free Software Foundation, Inc.

# This file is part of GDB.

# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 3 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program.  If not, see <http://www.gnu.org/licenses/>.

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

prefix = @prefix@
exec_prefix = @exec_prefix@

host_alias = @host_alias@
target_alias = @target_alias@
program_transform_name = @program_transform_name@
build_canonical = @build@
host_canonical = @host@
target_canonical = @target@
target_cpu = @target_cpu@


SHELL = @SHELL@
SUBDIRS = @subdirs@
RPATH_ENVVAR = @RPATH_ENVVAR@

EXPECT = `if [ -f ../../../expect/expect ] ; then \
          echo ../../../expect/expect ; \
          else echo expect ; fi`

RUNTEST = $(RUNTEST_FOR_TARGET)

RUNTESTFLAGS =

RUNTEST_FOR_TARGET = `\
  if [ -f $${srcroot}/dejagnu/runtest ]; then \
    echo $${srcroot}/dejagnu/runtest; \
  else \
    if [ "$(host_canonical)" = "$(target_canonical)" ]; then \
      echo runtest; \
    else \
      t='$(program_transform_name)'; echo runtest | sed -e '' $$t; \
    fi; \
  fi`


AS_FOR_TARGET = `\
  if [ -x ../../../gas/as-new ]; then \
    echo ../../../gas/as-new ; \
  else \
    echo $(target_alias)-as ; \
  fi`

LD_FOR_TARGET = `\
  if [ -x ../../../ld/ld-new ]; then \
    echo ../../../ld/ld-new ; \
  else \
    echo $(target_alias)-ld ; \
  fi`

RUN_FOR_TARGET = `\
  if [ -x ../../../sim/${target_cpu}/run ]; then \
    echo ../../../sim/${target_cpu}/run ; \
  else \
    echo $(target_alias)-run ; \
  fi`

TESTS = \
	exit47.ko \
	grloop.ok \
	hello.ok


check: sanity $(TESTS)
sanity:
	@eval echo AS_FOR_TARGET = $(AS_FOR_TARGET)
	@eval echo LD_FOR_TARGET = $(LD_FOR_TARGET)
	@eval echo RUN_FOR_TARGET = $(RUN_FOR_TARGET)



# Rules for running all the tests, put into three types
# exit success, exit fail, print "Hello World"

.u.log:
	uudecode $*.u
	$(RUN_FOR_TARGET) $* > $*.log


# Rules for running the tests

.SUFFIXES: .u .ok .run .hi .ko
.run.ok:
	rm -f tmp-$* $*.hi
	ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$*
	mv tmp-$* $*.ok
.run.hi:
	rm -f tmp-$* $*.hi diff-$*
	ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$*
	echo "Hello World" | diff - tmp-$* > diff-$*
	cat tmp-$* diff-$* > $*.hi
.run.ko:
	rm -f tmp-$* $*.ko
	set +e ; \
	ulimit -t 5 ; $(RUN_FOR_TARGET) $*.run > tmp-$* ; \
	if [ $$? -eq 47 ] ; then \
	  exit 0 ; \
	else \
	  exit 1 ; \
	fi
	mv tmp-$* $*.ko


# Rules for building all the tests and packing them into
# uuencoded files.

uuencode: em-pstr.u em-e0.u em-e47.u em-pchr.u

.SUFFIXES: .u .s .run
.s.u:
	rm -f $*.o $*.run
	$(AS_FOR_TARGET) $(srcdir)/$*.s -o $*.o
	$(LD_FOR_TARGET) -o $* $*.o
	uuencode < $* $* > $*.u
	rm -f $*.o $*
.s.run:
	rm -f $*.o $*.run
	$(AS_FOR_TARGET) $(srcdir)/$*.s -o $*.o
	$(LD_FOR_TARGET) -o $*.run $*.o
	rm -f $*.o $*


clean mostlyclean:
	rm -f *~ core *.o a.out
	rm -f $(TESTS)

distclean maintainer-clean realclean: clean
	rm -f *~ core
	rm -f Makefile config.status *-init.exp
	rm -fr *.log summary detail *.plog *.sum *.psum site.*

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

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