#    Makefile template for Configure for the sim library.
#    Copyright (C) 1993-2020 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

install-strip:
	@rootme=`pwd` ; export rootme ; \
	for dir in . ${SUBDIRS}; do \
		if [ "$$dir" = "." ]; then \
			true; \
		elif [ -d $$dir ]; then \
			(cd $$dir; $(MAKE) $(FLAGS_TO_PASS) install-strip) || 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
