# Makefile for regression testing the GNU debugger.
# Copyright (C) 1997-1998, 2007-2012 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@
prefix = @prefix@
exec_prefix = @exec_prefix@

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

arch = @sim_arch@

SHELL = /bin/sh
SUBDIRS = @subdirs@
RPATH_ENVVAR = @RPATH_ENVVAR@

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

RUNTEST = `if [ -f $${srcdir}/../../dejagnu/runtest ] ; then \
		echo $${srcdir}/../../dejagnu/runtest ; else echo runtest; \
	   fi`

RUNTESTFLAGS =

#### host, target, and site specific Makefile frags come in here.

# The use of $$(x_FOR_TARGET) reduces the command line length by not
# duplicating the lengthy definition.

TARGET_FLAGS_TO_PASS = \
        "prefix=$(prefix)" \
        "exec_prefix=$(exec_prefix)" \
        "against=$(against)" \
        'CC=$$(CC_FOR_TARGET)' \
        "CC_FOR_TARGET=$(CC_FOR_TARGET)" \
        "CFLAGS=$(TESTSUITE_CFLAGS)" \
        "CHILLFLAGS=$(CHILLFLAGS)" \
        'CHILL=$$(CHILL_FOR_TARGET)' \
        "CHILL_FOR_TARGET=$(CHILL_FOR_TARGET)" \
        "CHILL_LIB=$(CHILL_LIB)" \
        'CXX=$$(CXX_FOR_TARGET)' \
        "CXX_FOR_TARGET=$(CXX_FOR_TARGET)" \
        "CXXFLAGS=$(CXXFLAGS)" \
        "MAKEINFO=$(MAKEINFO)" \
        "INSTALL=$(INSTALL)" \
        "INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
        "INSTALL_DATA=$(INSTALL_DATA)" \
        "RUNTESTFLAGS=$(RUNTESTFLAGS)"

#        "RUNTEST=$(RUNTEST)" \

all:
	@echo "Nothing to be done for all..."

.NOEXPORT:
info:
install-info:
dvi:

install:

uninstall: force

installcheck:

check:  check-DEJAGNU check-recursive

#test1:
check-recursive: 
	@for i in . ${SUBDIRS}; do \
		if [ $$i = . ] ; then continue ; fi ; \
		if [ -d ./$$i ] ; then \
			if (rootme=`pwd`/ ; export rootme ; \
			    rootsrc=`cd $(srcdir); pwd`/ ; export rootsrc ; \
                                echo "check recursively into $$i directory..."; \
				cd ./$$i; \
				$(MAKE) $(TARGET_FLAGS_TO_PASS) check) ; then true ; \
			else exit 1 ; fi ; \
		else true ; fi ; \
	done

#test2:	
check-DEJAGNU: site.exp
	echo "Dejagnu-checking in `pwd` directory ..."
	rootme=`pwd`; export rootme; echo rootme = $$rootme; \
	srcdir=`cd ${srcdir}; pwd`; export srcdir ; echo srcdir = $$srcdir; \
	EXPECT=${EXPECT} ; export EXPECT ; echo EXPECT = $$EXPECT; \
	if [ -f $$rootme/../../expect/expect ]; then \
	  TCL_LIBRARY=`cd $$srcdir/../../tcl/library && pwd`; \
	  export TCL_LIBRARY; \
	fi; \
        echo TCL_LIBRARY = $$TCL_LIBRARY; \
	runtest=$(RUNTEST); echo runtest = $$runtest; \
	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
	  $$runtest $(RUNTESTFLAGS); \
	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
	fi


site.exp: Makefile
	@echo 'Making a new site.exp file...'
	-@rm -f site.bak
	@echo '## these variables are automatically generated by make ##' > $@-t
	@echo '# Do not edit here.  If you wish to override these values' >> $@-t
	@echo '# edit the last section' >> $@-t
	@echo 'set tool sim' >> $@-t
	@echo 'set srcdir $(srcdir)' >> $@-t
	@echo 'set objdir' `pwd` >> $@-t
	@echo 'set arch $(arch)' >> $@-t
	@echo 'set build_alias $(build_alias)' >> $@-t
	@echo 'set build_triplet $(build_canonical)' >> $@-t
	@echo 'set host_alias $(host_alias)' >> $@-t
	@echo 'set host_triplet $(host_canonical)' >> $@-t
	@echo 'set target_alias $(target_alias)' >> $@-t
	@echo 'set target_triplet $(target_canonical)' >> $@-t
	@echo '## All variables above are generated by configure. Do Not Edit ##' >> $@-t
	-@sed '1,/^## All variables above are.*##/ d' site.exp >> $@-t
	-@mv site.exp site.bak
	@mv $@-t site.exp

force:;

clean mostlyclean:
	-rm -f *~ core *.o a.out xgdb *.x *.grt
	-rm -f *.rum *.c *.dif *.*out
	if [ x"${SUBDIRS}" != x ] ; then \
	    for dir in ${SUBDIRS}; \
	    do \
		    echo "$$dir:"; \
		    if [ -d $$dir ]; then \
			    (cd $$dir; $(MAKE) clean); \
		    fi; \
	    done ; \
	else true; fi

distclean maintainer-clean realclean: clean
	-rm -f *~ core
	-rm -f Makefile config.status *-init.exp
	-rm -fr *.log summary detail *.plog *.sum *.psum site.*
	if [ x"${SUBDIRS}" != x ] ; then \
	    for dir in ${SUBDIRS}; \
	    do \
		    echo "$$dir:"; \
		    if [ -d $$dir ]; then \
			    (cd $$dir; $(MAKE) distclean); \
		    fi; \
	    done ; \
	else true; fi

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

config.status: $(srcdir)/configure
	$(SHELL) ./config.status --recheck
# FIXME: Requires --enable-maintainer-mode, which one could add, but
# it's provided by automake.  Maybe switch to automake someday.
#$(srcdir)/configure: @MAINT@ $(srcdir)/configure.in
#	cd $(srcdir) && autoconf
