#    Makefile template for Configure for the Blackfin simulator.
#    Copyright (C) 2005-2016 Free Software Foundation, Inc.
#    Written by Analog Devices, Inc.
# 
# 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/>.

# This selects the bfin newlib/libgloss syscall definitions.
NL_TARGET = -DNL_TARGET_bfin

## COMMON_PRE_CONFIG_FRAG

SIM_OBJS = \
	$(SIM_NEW_COMMON_OBJS) \
	bfin-sim.o \
	devices.o \
	gui.o \
	interp.o \
	machs.o \
	sim-resume.o

INCLUDE = bfin-sim.h

SIM_EXTRA_CFLAGS = @SDL_CFLAGS@
SIM_EXTRA_LIBS = @SDL_LIBS@ -lm

## COMMON_POST_CONFIG_FRAG

$(srcdir)/linux-fixed-code.h: @MAINTAINER_MODE_TRUE@ $(srcdir)/linux-fixed-code.s Makefile.in
	$(AS_FOR_TARGET) $(srcdir)/linux-fixed-code.s -o linux-fixed-code.o
	(	set -e; \
		echo "/* DO NOT EDIT: Autogenerated from linux-fixed-code.s.  */"; \
		echo "static const unsigned char bfin_linux_fixed_code[] ="; \
		echo "{"; \
		$(OBJDUMP_FOR_TARGET) -d -z linux-fixed-code.o > $@.dis; \
		sed -n \
			-e 's:^[^	]*	:0x:' \
			-e '/^0x/{s:	.*::;s: *$$:,:;s: :, 0x:g;p;}' \
			$@.dis; \
		rm -f $@.dis; \
		echo "};" \
	) > $@.tmp
	rm -f linux-fixed-code.o
	mv $@.tmp $@
