#    Makefile template for Configure for the erc32sim library.
#    Copyright (C) 1993, 1996, 1997, 2007, 2008, 2009
#    Free Software Foundation, Inc.
#    Written by Cygnus Support
#    Modified by J.Gaisler ESA/ESTEC
# 
# 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/>.

## COMMON_PRE_CONFIG_FRAG

TERMCAP_LIB = @TERMCAP@
READLINE_LIB = @READLINE@

SIM_OBJS = exec.o erc32.o func.o help.o float.o interf.o
SIM_EXTRA_LIBS = $(READLINE_LIB) $(TERMCAP_LIB) -lm
SIM_EXTRA_ALL = sis
SIM_EXTRA_INSTALL = install-sis
SIM_EXTRA_CLEAN = clean-sis

# UARTS run at about 115200 baud (simulator time). Add -DFAST_UART to
# CFLAGS if faster (infinite) UART speed is desired. Might affect the
# behaviour of UART interrupt routines ...
SIM_EXTRA_CFLAGS = -DSTAT -DFAST_UART -DIUREV0 -DMECREV0

## COMMON_POST_CONFIG_FRAG

# `sis' doesn't need interf.o.
SIS_OFILES = exec.o erc32.o func.o help.o float.o

sis: sis.o $(SIS_OFILES) $(COMMON_OBJS) $(LIBDEPS)
	$(CC) $(ALL_CFLAGS) -o sis \
	  sis.o $(SIS_OFILES) $(COMMON_OBJS) $(EXTRA_LIBS)

# FIXME: This computes the build host's endianness, doesn't it?
# There is AC_C_BIGENDIAN but it doesn't handle float endianness.
# [Are int/float endians every different on a sparc?]
end: $(srcdir)/end.c
	$(CC_FOR_BUILD) $(srcdir)/end.c -o end
end.h: end
	./end > end.h

# Copy the files into directories where they will be run.
install-sis: installdirs
	n=`echo sis | sed '$(program_transform_name)'`; \
	$(INSTALL_PROGRAM) sis$(EXEEXT) $(DESTDIR)$(bindir)/$$n$(EXEEXT)

clean-sis:
	rm -f sis end end.h

configure:
	@echo "Rebuilding configure..."
	if [ x"${srcdir}" = x"@srcdir@" ] ; then \
	  srcdir=. ; export srcdir ; \
	else true ; fi ; \
	(cd $${srcdir}; autoconf --localdir=../common)

# Circumvent Sun Make bug with VPATH.
erc32.o: erc32.c sis.h end.h
exec.o: exec.c sis.h end.h
float.o: float.c sis.h end.h
func.o: func.c sis.h end.h
help.o: help.c sis.h end.h
interf.o: interf.c sis.h end.h 
sis.o: sis.c sis.h end.h
