# Makefile for regression testing the GNU debugger.
# Copyright (C) 1997-2016 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
