#    Makefile template for Configure for the sim library.
#    Copyright (C) 1993, 1995, 1997-1998, 2007-2012 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 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@

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

datarootdir = @datarootdir@
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@
CFLAGS_FOR_BUILD = @CFLAGS_FOR_BUILD@
MAKEINFO = makeinfo
RANLIB = @RANLIB@

SUBDIRS = @subdirs@

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

#### 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)" \
	"bindir=$(bindir)" \
	"mandir=$(mandir)" \
	"libdir=$(libdir)" \
	"against=$(against)" \
	"AR=$(AR)" \
	"AR_FLAGS=$(AR_FLAGS)" \
	"CC=$(CC)" \
	"CC_FOR_BUILD=$(CC_FOR_BUILD)" \
	"CFLAGS=$(CFLAGS)" \
	"CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
	"RANLIB=$(RANLIB)" \
	"MAKEINFO=$(MAKEINFO)" \
	"INSTALL=$(INSTALL)" \
	"INSTALL_DATA=$(INSTALL_DATA)" \
	"INSTALL_PROGRAM=$(INSTALL_PROGRAM)" \
	"RUNTEST=$(RUNTEST)" \
	"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)" \
	"RUNTEST=$(RUNTEST)" \
	"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)) || exit 1; \
		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) $@) || exit 1; \
		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) $@) || exit 1; \
		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) || exit 1; \
		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:
pdf:
install-pdf:
html:
install-html:

### 
### 

.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 SHELL=/bin/sh".
.PHONY: autoconf-common autoheader-common
autoconf-common autoheader-common:
	for d in * ; \
	do \
	    if [ -d $$d -a -f $$d/configure.ac ] ; \
	    then \
		 echo "Running autoconf in $$d ..." ; \
		 (cd $$d && autoconf --force) ; \
		 if [ $@ = autoheader-common ] && [ -f $$d/config.in ] ; \
		 then \
		   echo "Running autoheader in $$d ..." ; \
		   (cd $$d && autoheader --force) ; \
		 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.ac ] ; \
	    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.ac ] ; \
	    then \
		 echo "Moving $$d/new-$(ChangeLog) to $$d/$(ChangeLog) ..." ; \
		 mv $$d/new-$(ChangeLog) $$d/$(ChangeLog) ; \
	    fi ; \
	done
