# ------------------------------------------------------------------------
# Makefile: for Compiler module (scrc)
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# RD 11/27/01	added example LongLong.sc (regression test for bug fix)
# RD 09/28/01	added example Exception.sc (new "simple" example)
# RD 09/27/01	added CharTest.sc to verify "signed char" platform assumption
# RD 09/07/01	added example Pipeline3.sc (as bug fix regression test)
# RD 05/25/01	eliminated support for binary SIR files (import/export)
# RD 05/25/01	renamed 'scc' to 'scrc'
# RD 05/25/01	reduced contents to SCRC requirements
# ------------------------------------------------------------------------

# --- macros

include ../../Makefile.macros

MODULE	=	Compiler
BINARY	=	scrc
BINFILE	=	$(BINARY)$(EXE_SUFFIX)
PREFIX	=	SCC_
MANPAGE	=	$(BINARY).l
LIBRARY	=
LIBOBJ	=
OBJECTS =
LIBDEP	=	$(SPECC_LIB)/libCcDriver.$(LIBSFX)	\
		$(SPECC_LIB)/libParser.$(LIBSFX)	\
		$(SPECC_LIB)/libIntRep.$(LIBSFX)	\
		$(SPECC_LIB)/libGlobal.$(LIBSFX)	\
		$(SPECC_LIB)/lib$(BIT_LIB_NAME).$(LIBSFX)	\
		$(SPECC_LIB)/lib$(LLONG_LIB_NAME).$(LIBSFX)
LIBS	=	-lCcDriver -lParser -lIntRep -lGlobal	\
		-l$(BIT_LIB_NAME) -l$(LLONG_LIB_NAME)
INCLUDE	=	$(MODULE).h $(SPECC_INC)/CcDriver.h $(SPECC_INC)/Parser.h \
		$(SPECC_INC)/IntRep.h $(SPECC_INC)/Global.h \
		$(SPECC_INC)/GL_String.h
NONEXEC	=	DataTypes.sc DataTypes2.sc T.sc Typical.sc Notes.sc \
		Behaviors.sc UserTypes.sc Move.sc Callback.sc Netlist.sc \
		Empty.sc Timing.sc Kanji.sc Conv.sc \
		L.sc R.sc X.sc Y.sc C.sc Z.sc
EXEC	=	HelloWorld.sc NewTypes.sc Sizes.sc FSM.sc FSM2.sc Adder.sc \
		Device.sc Main.sc Pipeline.sc Pipeline2.sc ExprEval.sc \
		Constructors.sc Union.sc Adder2.sc ArrayCopy.sc ArrayCopy2.sc \
		ClassAccess.sc Init.sc Pipeline3.sc CharTest.sc LongLong.sc \
		examples/Adder.sc examples/Behaviors.sc examples/BitVectors.sc \
		examples/Callback.sc examples/DataTypes.sc examples/FSM.sc \
		examples/HelloWorld.sc examples/Notes.sc examples/Pipeline.sc \
		examples/Pipeline2.sc examples/Timing.sc \
		examples/Handshaking1.sc examples/Handshaking2.sc \
		examples/Exception.sc
EXAMPLE	=	$(NONEXEC) $(EXEC)
DIST	=	$(MODULE).c $(MODULE).h Makefile $(MANPAGE).in .purify \
		$(EXAMPLE)
ORIG	=	$(MODULE).c $(MODULE).h Makefile $(MANPAGE).in \
		X.sc Y.sc C.sc Z.sc Main.sc ArrayCopy.sc ArrayCopy2.sc


# --- compilation rules

all:		$(BINFILE) $(SPECC_BIN)/$(BINFILE) \
		$(MANPAGE) $(SPECC_MAN)/manl/$(MANPAGE)


$(BINFILE):	$(BINARY).o $(OBJECTS) $(LIBDEP)
	$(LN) -o $(BINFILE) $(BINARY).o $(OBJECTS) $(LIBS) $(STDLIB)

$(BINARY)_pure:	$(BINARY).o $(OBJECTS) $(LIBDEP)
	$(LNPURE) -o $(BINARY)_pure $(BINARY).o $(OBJECTS) $(LIBS) $(STDLIB)

$(BINARY).o:	$(MODULE).c $(INCLUDE)
	$(CC) -DTHREAD_BASE=\"$(THREAD_BASE)\" -o $(BINARY).o $(MODULE).c

# if there is no symbolic link already, create a copy in the public directory
$(SPECC_BIN)/$(BINFILE):	$(BINFILE)
	$(CP) $(BINFILE) $(SPECC_BIN)

$(SPECC_MAN)/manl/$(MANPAGE):	$(MANPAGE)
	$(CP) $(MANPAGE) $(SPECC_MAN)/manl


# --- external sources

$(SPECC_LIB)/libbit.$(LIBSFX):
	cd $(SPECC_SRC)/bit ; $(MAKE) libbit.$(LIBSFX)

$(SPECC_LIB)/libGlobal.$(LIBSFX):
	cd $(SPECC_SRC)/Global ; $(MAKE) libGlobal.$(LIBSFX)

$(SPECC_LIB)/libCcDriver.$(LIBSFX):
	cd $(SPECC_SRC)/CcDriver ; $(MAKE) libCcDriver.$(LIBSFX)

$(SPECC_LIB)/libIntRep.$(LIBSFX):
	cd $(SPECC_SRC)/IntRep ; $(MAKE) libIntRep.$(LIBSFX)

$(SPECC_LIB)/libParser.$(LIBSFX):
	cd $(SPECC_SRC)/Parser ; $(MAKE) libParser.$(LIBSFX)


# --- service rules

clean:
	-$(RM) *.bak *.BAK *~	
	-$(RM) *.o $(BINFILE) core
	-$(RM) $(MANPAGE)
	-$(RM) *.pure* *_pure* .pure
	-for ex in $(EXAMPLE); do					\
		EX=`dirname $$ex`/`basename $$ex .sc` ;			\
		$(RM) $$EX.si $$EX.cc $$EX.h $$EX.o $$EX ;		\
		done
	-$(RM) stdout examples/stdout

dist:
	for file in $(DIST); do echo $(DISTPREFIX)/$$file >>$(DISTLIST); done

orig:
	for file in $(ORIG); do echo $(ORIGPREFIX)/$$file >>$(ORIGLIST); done

test:		test1

test1:		test1a test1b

test1a:		$(BINFILE) $(EXAMPLE)
	set -e;								\
	DIR=`pwd` ;							\
	SPECC=$(SPECC) ; export SPECC ;					\
	for ex in $(EXAMPLE); do					\
	EX=`basename $$ex .sc` ;					\
	echo "***" ;							\
	echo "*** TEST:" $$ex ;						\
	echo "***" ;							\
	cd `dirname $$ex` ;						\
	echo "***" ;							\
	echo "*** Translating to C++ (" $$EX.cc "," $$EX.h ")..." ;	\
	echo "***" ;							\
	$$DIR/$(BINFILE) $$EX -sc2cch -vv -w >stdout;			\
	diff /dev/null stdout;						\
	cd $$DIR ;							\
	done

test1b:		$(BINFILE) $(EXEC)
	set -e;								\
	DIR=`pwd` ;							\
	SPECC=$(SPECC) ; export SPECC ;					\
	for ex in $(EXEC); do						\
		EX=`basename $$ex .sc` ;				\
		cd `dirname $$ex` ;					\
		echo "***" ;						\
		echo "*** Compiling (" $$EX ")..." ;			\
		echo "***" ;						\
		$$DIR/$(BINFILE) $$EX -cc2out -vv -w >stdout;		\
		echo "***" ;						\
		echo "*** Executing (" $$EX ")..." ;			\
		echo "***" ;						\
		./$$EX ;						\
		diff /dev/null stdout;					\
		cd $$DIR ;						\
	done


pure:		$(BINARY)_pure

puretest:	puretest1

puretest1:	puretest1a puretest1b

puretest1a:	$(BINARY)_pure $(EXAMPLE)
	set -e;								\
	DIR=`pwd` ;							\
	SPECC=$(SPECC) ; export SPECC ;					\
	for ex in $(EXAMPLE); do					\
	EX=`basename $$ex .sc` ;					\
	echo "***" ;							\
	echo "*** TEST:" $$ex ;						\
	echo "***" ;							\
	cd `dirname $$ex` ;						\
	echo "***" ;							\
	echo "*** Translating to C++ (" $$EX.cc "," $$EX.h ")..." ;	\
	echo "***" ;							\
	$$DIR/$(BINARY)_pure $$EX -sc2cch -vv -w >stdout;		\
	diff /dev/null stdout;						\
	cd $$DIR ;							\
	done

puretest1b:	$(BINARY)_pure $(EXEC)
	set -e;								\
	DIR=`pwd` ;							\
	SPECC=$(SPECC) ; export SPECC ;					\
	for ex in $(EXEC); do						\
		EX=`basename $$ex .sc` ;				\
		cd `dirname $$ex` ;					\
		echo "***" ;						\
		echo "*** Compiling (" $$EX ")..." ;			\
		echo "***" ;						\
		$$DIR/$(BINARY)_pure $$EX -cc2out -vv -w >stdout;	\
		echo "***" ;						\
		echo "*** Executing (" $$EX ")..." ;			\
		echo "***" ;						\
		./$$EX ;						\
		diff /dev/null stdout;					\
		cd $$DIR ;						\
	done


scrctest:	test1a


# --- EOF Makefile ---
