# Makefile for regression testing GNU texinfo.
#   Copyright (C) 1987, 88, 90, 91, 92, 93, 1994 Free Software Foundation, Inc.

#This file is part of GNU texinfo.

#texinfo 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.

#texinfo 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 GNU CC; see the file COPYING.  If not, write to
#the Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

srcdir = @srcdir@
VPATH  = @srcdir@

prefix = @prefix@

exec_prefix = @exec_prefix@
bindir = @bindir@
libdir = @libdir@
tooldir = $(libdir)/$(target_alias)

datadir = @datadir@/deja-gnu

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 = 
FLAGS_TO_PASS =

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

all:

info:

install-info:

check: site.exp all
	rootme=`pwd`; export rootme; \
	srcdir=${srcdir} ; export srcdir ; \
	EXPECT=${EXPECT} ; export EXPECT ; \
	if [ -f $${rootme}/../../expect/expect ] ; then  \
	   TCL_LIBRARY=$${srcdir}/../../tcl/library ; \
	   export TCL_LIBRARY ; fi ; \
	$(RUNTEST) $(RUNTESTFLAGS) $(FLAGS_TO_PASS) --tool makeinfo \
	   --srcdir $(srcdir) --target $(target_canonical)

site.exp: ./config.status Makefile
	@echo "Making a new config file..."
	-@rm -f ./tmp?
	@touch site.exp

	-@mv site.exp site.bak
	@echo "## these variables are automatically generated by make ##" > ./tmp0
	@echo "# Do not edit here. If you wish to override these values" >> ./tmp0
	@echo "# add them to the last section" >> ./tmp0
	@echo "set host_os ${host_os}" >> ./tmp0
	@echo "set host_alias ${host_alias}" >> ./tmp0
	@echo "set host_cpu ${host_cpu}" >> ./tmp0
	@echo "set host_vendor ${host_vendor}" >> ./tmp0
	@echo "set target_os ${target_os}" >> ./tmp0
	@echo "set target_alias ${target_alias}" >> ./tmp0
	@echo "set target_cpu ${target_cpu}" >> ./tmp0
	@echo "set target_vendor ${target_vendor}" >> ./tmp0
	@echo "set host_triplet ${host_canonical}" >> ./tmp0
	@echo "set target_triplet ${target_canonical}" >> ./tmp0
	@echo "set tool binutils" >> ./tmp0
	@echo "set srcdir ${srcdir}" >> ./tmp0
	@echo "set objdir `pwd`" >> ./tmp0
	@echo "set MAKEINFO makeinfo" >> ./tmp0
	@echo "## All variables above are generated by configure. Do Not Edit ##" >> ./tmp0
		@cat ./tmp0 > site.exp
	@cat site.bak | sed \
			-e '1,/^## All variables above are.*##/ d' >> site.exp
	-@rm -f ./tmp?

install:
uninstall:

clean:
	-rm -f *~ */*~ core *.info* *.log *.sum *.plog *.psum

distclean: clean
	-rm -f Makefile config.status site.exp config.cache config.log

Makefile : $(srcdir)/Makefile.in $(host_makefile_frag) $(target_makefile_frag)
	$(SHELL) ./config.status

