# Makefile for GNU binary-file utilities
# Copyright (C) 1992, 93, 94, 95, 96, 97, 1998 Free Software Foundation, Inc.

# This file is part of GNU binutils.

# 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 = $(exec_prefix)/$(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@

# This can be referenced by the gettext configuration code.
top_builddir = ..

SHELL = /bin/sh

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

AR = @AR@
AR_FLAGS = qv
CC = @CC@
CFLAGS = @CFLAGS@
MAKEINFO = makeinfo
TEXI2DVI = texi2dvi
RANLIB = @RANLIB@
TEXI2ROFF=texi2roff
MAKEOVERRIDES=
CC_FOR_BUILD = @CC_FOR_BUILD@

HDEFINES = @HDEFINES@
TDEFINES =

# Comment these out if using lex.
# Distribution version

# Distribution name

# Where to find texinfo.tex to format docn with TeX
TEXIDIR = $(srcdir)/../texinfo

# These should all be the same program too.
RUN_PROG=run
SIM_LIB=libsim.a
ADDL_LIBS=

PROGS = $(RUN_PROG)
LIBS= $(SIM_LIB)

DISTSTUFF = $(PROGS) $(LIBS)

BASEDIR = $(srcdir)/../..
BFDDIR = $(BASEDIR)/bfd
INCDIR	= $(BASEDIR)/include
GDBDIR = $(BASEDIR)/gdb
INCLUDES = -I. -I$(srcdir) -I../../bfd -I$(BFDDIR) -I$(INCDIR) -I$(GDBDIR)

#### host and target dependant Makefile fragments come in here.
###

ALL_CFLAGS = $(INCLUDES) $(HDEFINES) $(TDEFINES) $(CFLAGS)

.c.o:
	$(CC) -c $(ALL_CFLAGS) $<

LIBIBERTY = ../../libiberty/libiberty.a

BFD = ../../bfd/libbfd.a

INTLLIBS = @INTLLIBS@
INTLDEPS = @INTLDEPS@

RUNTEST = runtest
RUNTESTFLAGS = 
FLAGS_TO_PASS = \
	"CC=$(CC)" \
	"CFLAGS=$(CFLAGS)" \
	"RUNTEST=$(RUNTEST)" \
	"RUNTESTFLAGS=$(RUNTESTFLAGS)"

#
## The rules

all: $(LIBS) $(PROGS)


$(RUN_PROG): $(LIBS) run.o $(BFD) $(INTLDEPS)
	$(CC) $(CFLAGS) $(LDFLAGS) -o $(RUN_PROG) run.o $(SIM_LIB) $(BFD) $(INTLLIBS) $(LIBIBERTY)

$(SIM_LIB): case.o interp.o
	rm -f $(SIM_LIB)
	$(AR) $(AR_FLAGS) $(SIM_LIB) case.o interp.o
	$(RANLIB) $(SIM_LIB)

case.c: gencode
	./gencode -c >case.c                     ; \
	if [ -x /usr/latest/bin/indent ] ; then    \
		/usr/latest/bin/indent case.c    ; \
	fi

optable:gencode
	./gencode >optable
	./gencode -a >$(srcdir)/../../opcodes/w65-opc.h

gencode:gencode.c
	$(CC_FOR_BUILD) -o gencode $<

run.o:run.c config.h
interp.o:interp.c config.h


######################################################################

mostlyclean:
	-rm -f *.o *~ \#* core binutils.?? binutils.??? case.c

clean: mostlyclean
	-rm -f $(PROGS) *.o *.a

distclean:
	-rm -f Makefile config.status sysdep.h *.o *~ \#* core y.* \
		binutils.?? binutils.??s binutils.aux binutils.log \
		binutils.toc gencode run config.log
	-rm -f $(PROGS) config.h stamp-h

maintainer-clean realclean: clean distclean
	-rm -f $(DISTSTUFF) TAGS

etags tags: TAGS

TAGS: force
	etags $(INCDIR)/*.h $(srcdir)/*.[hc] 

install: all installdirs
	for i in $(PROGS) ; do \
	  n=`echo $$i | sed -e 's/.new//' | sed '$(program_transform_name)'`; \
	  $(INSTALL_PROGRAM) $$i $(bindir)/$$n; \
	done

installdirs:
	$(SHELL) $(srcdir)/../../mkinstalldirs $(bindir)

install-info:

clean-info:
	-rm -rf *.info*

# Making a dist:
# cvs rtag binutils-x-yy ld+utils
# cvs co -r binutils-x-yy ld+utils
# cd {HERE}; make dist [-f Makefile.in]

dist: $(DIST_NAME).tar.z

diststuff: $(DISTSTUFF)

$(DIST_NAME).tar.z:
	cd ../..; rm -f $(DIST_NAME); ln -s devo $(DIST_NAME)
	make diststuff -f Makefile.in
	cd ../ld; make diststuff -f Makefile.in
	cd ../gprof; make diststuff -f Makefile.in
	cd ../texinfo; mv texinfo.tex ..; rm -rf *; mv ../texinfo.tex .
	# Take out texinfo from configurable dirs
	mv ../configure.in tmp; \
	  sed -e '/^host_tools=/s/texinfo //' <tmp >../configure.in; rm tmp
	cd ..; chmod og=u `find . -print`
	cd ../..; tar chf - $(DIST_NAME) | gzip >$(DIST_NAME).tar.z
	rm -rf ../../$(DIST_NAME)


# Dummy target to force execution of dependent targets.
#
force:

# Target to uncomment host-specific lines in this makefile.  Such lines must
# have the following string beginning in column 1: #__<hostname>__#
# Original Makefile is backed up as 'Makefile.old'.
#
# Invoke with:  make make HOST=xxx
#
make:
	-@if test $(HOST)x = x ; then \
		echo 'Specify "make make HOST=???"'; \
		exit 1; \
	fi ; \
	grep -s "^#The next line was generated by 'make make'" Makefile; \
	if test $$? = 0 ; then	\
		echo "Makefile has already been processed with 'make make'";\
		exit 1; \
	fi ; \
	mv -f Makefile Makefile.old; \
	echo "#The next line was generated by 'make make'"	 >Makefile ; \
	echo "HOST=$(HOST)"					>>Makefile ; \
	echo							>>Makefile ; \
	sed "s/^#__$(HOST)__#//" < Makefile.old			>>Makefile

Makefile: Makefile.in config.status
	CONFIG_FILES=Makefile CONFIG_HEADERS= $(SHELL) ./config.status

config.h: stamp-h ; @true
stamp-h: config.in config.status
	CONFIG_FILES= CONFIG_HEADERS=config.h:config.in $(SHELL) ./config.status

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

### Local Variables: ***
### mode:fundamental ***
### page-delimiter: "^#" ***
### End: ***
### end of file
