## automake - create Makefile.in from Makefile.am
## Copyright (C) 1994, 1995, 1996, 1997, 2000, 2001, 2003, 2006
## Free Software Foundation, Inc.

## 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 2, 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/>.

## Name of tool to use.  Default is the same as the package.
DEJATOOL = $(PACKAGE)

## Default flags to pass to dejagnu.  The user can override this.
RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir

## In Cygnus mode, these are found in the build tree.
## Otherwise they are looked for in $PATH.
if %?CYGNUS%
EXPECT = `if test -f $(top_builddir)/../expect/expect; then \
	    echo $(top_builddir)/../expect/expect; \
	  else \
	    echo expect; \
	  fi`

RUNTEST = `if test -f $(top_srcdir)/../dejagnu/runtest; then \
	     echo $(top_srcdir)/../dejagnu/runtest; \
	   else \
	     echo runtest; \
	   fi`
else ! %?CYGNUS%
EXPECT = expect
RUNTEST = runtest
endif ! %?CYGNUS%


.PHONY: check-DEJAGNU
check-DEJAGNU: site.exp
## Life is easiest with an absolute srcdir, so do that.
	srcdir=`$(am__cd) $(srcdir) && pwd`; export srcdir; \
	EXPECT=$(EXPECT); export EXPECT; \
## Allow this to work when expect and DejaGnu are in tree.
## Only required when --cygnus in force.
?CYGNUS?	if [ -f $(top_builddir)/../expect/expect ]; then \
?CYGNUS?	  TCL_LIBRARY=`$(am__cd) $(top_srcdir)/../tcl/library && pwd`; \
?CYGNUS?	  export TCL_LIBRARY; \
?CYGNUS?	fi; \
	runtest=$(RUNTEST); \
## If runtest can't be found, print a warning but don't die.  It is
## pointless to cause a failure if the tests cannot be run at all.
	if $(SHELL) -c "$$runtest --version" > /dev/null 2>&1; then \
	  exit_status=0; l='$(DEJATOOL)'; for tool in $$l; do \
	    if $$runtest $(AM_RUNTESTFLAGS) $(RUNTESTDEFAULTFLAGS) $(RUNTESTFLAGS); \
	    then :; else exit_status=1; fi; \
	  done; \
	else echo "WARNING: could not find \`runtest'" 1>&2; :;\
	fi; \
	exit $$exit_status


## ------------------- ##
## Building site.exp.  ##
## ------------------- ##

## Note that in the rule we don't directly generate site.exp to avoid
## the possibility of a corrupted site.exp if make is interrupted.
## Jim Meyering has some useful text on this topic.
site.exp: Makefile
	@echo 'Making a new site.exp file...'
	@echo '## these variables are automatically generated by make ##' >site.tmp
	@echo '# Do not edit here.  If you wish to override these values' >>site.tmp
	@echo '# edit the last section' >>site.tmp
	@echo 'set srcdir $(srcdir)' >>site.tmp
	@echo "set objdir `pwd`" >>site.tmp
## Quote the *_alias variables because they might be empty.
?BUILD?	@echo 'set build_alias "$(build_alias)"' >>site.tmp
?BUILD?	@echo 'set build_triplet $(build_triplet)' >>site.tmp
?HOST?	@echo 'set host_alias "$(host_alias)"' >>site.tmp
?HOST?	@echo 'set host_triplet $(host_triplet)' >>site.tmp
?TARGET?	@echo 'set target_alias "$(target_alias)"' >>site.tmp
?TARGET?	@echo 'set target_triplet $(target_triplet)' >>site.tmp
	@echo '## All variables above are generated by configure. Do Not Edit ##' >>site.tmp
	@test ! -f site.exp || \
	  sed '1,/^## All variables above are.*##/ d' site.exp >> site.tmp
	@-rm -f site.bak
	@test ! -f site.exp || mv site.exp site.bak
	@mv site.tmp site.exp

## ---------- ##
## Cleaning.  ##
## ---------- ##

.PHONY distclean-am: distclean-DEJAGNU

distclean-DEJAGNU:
## Any other cleaning must be done by the user or by the test suite
## itself.  We can't predict what dejagnu or the test suite might
## generate.
	-rm -f site.exp site.bak
	-l='$(DEJATOOL)'; for tool in $$l; do \
	  rm -f $$tool.sum $$tool.log; \
	done
