#    Makefile template for Configure for the sim library.
#    Copyright (C) 1993, 1995, 1997, 1998 Free Software Foundation, Inc.
#    Written by Cygnus Support.
# 
# This file is part of BFD, the Binary File Descriptor library.
# 
# 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 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, write to the Free Software
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.

VPATH = @srcdir@
srcdir = @srcdir@

prefix = @prefix@
exec_prefix = @exec_prefix@

host_alias = @host_alias@
target_alias = @target_alias@
program_transform_name = @program_transform_name@
bindir = @bindir@
libdir = @libdir@
tooldir = $(libdir)/$(target_alias)

datadir = @datadir@
mandir = @mandir@
man1dir = $(mandir)/man1
man2dir = $(mandir)/man2
man3dir = $(mandir)/man3
man4dir = $(mandir)/man4
man5dir = $(mandir)/man5
man6dir = $(mandir)/man6
man7dir = $(mandir)/man7
man8dir = $(mandir)/man8
man9dir = $(mandir)/man9
infodir = @infodir@
includedir = @includedir@

SHELL = @SHELL@

INSTALL = @INSTALL@
INSTALL_PROGRAM = @INSTALL_PROGRAM@
INSTALL_DATA = @INSTALL_DATA@

AR = @AR@
AR_FLAGS = rc
CC = @CC@
CFLAGS = @CFLAGS@
CC_FOR_BUILD = @CC_FOR_BUILD@
MAKEINFO = makeinfo
RANLIB = @RANLIB@

SUBDIRS = @subdirs@

INCDIR = $(srcdir)/../include
CSEARCH = -I. -I$(srcdir) -I$(INCDIR)
DEP = mkdep

# compilers to use to create programs which must be run in the build
# environment.
CC_FOR_BUILD = $(CC)

#### Makefile fragments come in here.
# @target_makefile_frag@
###

# Name of the ChangeLog file.
ChangeLog = ChangeLog


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

FLAGS_TO_PASS = \
	"prefix=$(prefix)" \
	"exec_prefix=$(exec_prefix)" \
	"against=$(against)" \
	"AR=$(AR)" \
	"AR_FLAGS=$(AR_FLAGS)" \
	"CC=$(CC)" \
	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
	"CFLAGS=$(CFLAGS)" \
	"RANLIB=$(RANLIB)" \
	"MAKEINFO=$(MAKEINFO)" \
	"INSTALL=$(INSTALL)" \
	"INSTALL_DATA=$(INSTALL_DATA)" \
	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
	"RUNTESTFLAGS=$(RUNTESTFLAGS)" \
	"SHELL=$(SHELL)"

# 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=$(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)" \
	"INSTALL=$(INSTALL)" \
	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
	"INSTALL_DATA=$(INSTALL_DATA)" \
	"MAKEINFO=$(MAKEINFO)" \
	"RUNTESTFLAGS=$(RUNTESTFLAGS)"


all:
	@rootme=`pwd` ; export rootme ; \
	for dir in . `echo ${SUBDIRS} | sed 's/testsuite//'` ; do \
		if [ "$$dir" = "." ]; then \
			true; \
		elif [ -d $$dir ]; then \
			(cd $$dir; $(MAKE) $(FLAGS_TO_PASS)); \
		else true; fi; \
	done

clean mostlyclean:
	@rootme=`pwd` ; export rootme ; \
	for dir in . ${SUBDIRS}; do \
		if [ "$$dir" = "." ]; then \
			true; \
		elif [ -d $$dir ]; then \
			(cd $$dir; $(MAKE) $(FLAGS_TO_PASS) $@); \
		else true; fi; \
	done

distclean maintainer-clean realclean:
	@rootme=`pwd` ; export rootme ; \
	for dir in . ${SUBDIRS}; do \
		if [ "$$dir" = "." ]; then \
			true; \
		elif [ -d $$dir ]; then \
			(cd $$dir; $(MAKE) $(FLAGS_TO_PASS) $@); \
		else true; fi; \
	done
	rm -f Makefile config.cache config.log config.status

install:
	@rootme=`pwd` ; export rootme ; \
	for dir in . ${SUBDIRS}; do \
		if [ "$$dir" = "." ]; then \
			true; \
		elif [ -d $$dir ]; then \
			(cd $$dir; $(MAKE) $(FLAGS_TO_PASS) install); \
		else true; fi; \
	done

installcheck:
	@echo No installcheck target is available yet for the GNU simulators.

installcheck:

# The check target can not use subdir_do, because subdir_do does not
# use TARGET_FLAGS_TO_PASS.
check: force
	@if [ -f testsuite/Makefile ]; then \
	  rootme=`pwd`; export rootme; \
	  rootsrc=`cd $(srcdir); pwd`; export rootsrc; \
	  cd testsuite; \
	  $(MAKE) $(TARGET_FLAGS_TO_PASS) check; \
	else true; fi



info:
install-info:
dvi:

### 
### 

.NOEXPORT:
MAKEOVERRIDES=

.PHONY: check installcheck
check:
installcheck:

TAGS:

force:

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

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

# Utility to run autoconf in each directory that uses the common framework.
# This is intended to be invoked in $srcdir as
# "make -f Makefile.in autoconf-common".
.PHONY: autoconf-common
autoconf-common autoheader-common:
	for d in * ; \
	do \
	    if [ -d $$d -a -f $$d/configure.in ] ; \
	    then \
		 echo "Running autoconf in $$d ..." ; \
		 (cd $$d && autoconf) ; \
		 if [ $@ = autoheader-common ] ; \
		 then \
		   echo "Running autoheader in $$d ..." ; \
		   (cd $$d && autoheader) ; \
		 fi ; \
	    fi ; \
	done

autoconf-changelog autoheader-changelog:
	id=$(ID) ; \
	test x$$id = x && id="`id | sed -e 's/^[^(]*(\([^)]*\).*$$/\1/'`" ; \
	name=$(NAME) ; \
	test x$$name = x && name=`grep "^$$id:" /etc/passwd | cut -f 5 -d ':'` ; \
	host=$(HOST) ; \
	test x$$host = x && host="`hostname`" ; \
	date=$(DATE) ; \
	test x$$date = x && date="`date +%Y-%m-%d`" ; \
	echo "$$date $$name $$id@$$host" ; \
	for d in * ; \
	do \
	    if [ -d $$d -a -f $$d/configure.in ] ; \
	    then \
		 echo "Creating new-$(ChangeLog) in $$d ..." ; \
		 ( echo "$$date  $$name  <$$id@$$host>" ; \
		   echo "" ; \
		   echo "	* configure: Regenerated to track ../common/aclocal.m4 changes." ; \
		   if [ $@ = autoheader-changelog ] ; \
		   then \
		     echo "	* config.in: Ditto." ; \
		   fi ; \
		   echo "" ; \
		   cat $$d/$(ChangeLog) \
		 ) > $$d/new-$(ChangeLog) ; \
	    fi ; \
	done

autoconf-install autoheader-install:
	for d in * ; \
	do \
	    if [ -d $$d -a -f $$d/configure.in ] ; \
	    then \
		 echo "Moving $$d/new-$(ChangeLog) to $$d/$(ChangeLog) ..." ; \
		 mv $$d/new-$(ChangeLog) $$d/$(ChangeLog) ; \
	    fi ; \
	done
