# ------------------------------------------------------------------------
# Makefile: for Compiler module (scrc)
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# 06/15/04 PC   Adjustments for scrc 2.0
# RD 10/28/03	added example FctPtrBug.sc
# RD 10/03/03	added example After.sc
# RD 05/19/03	include SIZEOF examples in cleanup
# RD 05/16/03	added passing of macros to the CcDriver
# RD 05/02/03	added validation of sizeof() computations (sizeof_test.cc)
# RD 04/01/03	added example Fsmd.sc
# RD 03/20/03	added examples BufBus.sc, BufSlice.sc, SigBus.sc, SigSlice.sc,
#		SigBus2.sc, SigBus2r.sc, SigBus2f.sc, SigAdder.sc
# RD 02/12/03	added examples alu*.sc, shift*.sc, and OnesCounter*.sc
# RD 01/06/03	added examples Signal2.sc Buffered2.sc Piped2.sc ClassConv.sc
#		Fibonacci.sc SigVectors.sc tanimoto1.sc tanimoto2.sc
# RD 12/27/02	added example DepTest.sc (test case for 'sir_depend')
# RD 12/18/02	added examples Signal.sc and Buffered.sc (similar to Piped.sc)
# RD 11/17/02	added example DbgGen.sc (test case for 'sir_gen')
# RD 11/05/02	added example MultGen.sc (test case for 'sir_gen')
# RD 10/04/02	added example Handshake.sc (regression test for bug fix)
# RD 10/03/02	separated 'clean' target into 'clean' and 'distclean'
# RD 09/16/02	added example Pointer.sc (regression test for bug fix)
# RD 08/16/02	added example Wrapper.sc
# RD 07/10/02	added examples FSM4.sc, FSM5.sc and FSM6.sc
# RD 06/25/02	added example Behaviors2.sc
# RD 05/13/02	disabled creation of log info for copies of SIR files
# RD 04/25/02	added example FSM3.sc
# RD 03/27/02	added example Piped.sc (regression test for bug fix)
# RD 02/27/02	added example LocalEvent.sc (regression test for bug fix)
# RD 02/26/02	added example AnonEnum.sc (regression test for bug fix)
# RD 02/15/02	added examples ImportInclude.sc, ImportFile.sc, HeaderFile.sc
# RD 01/09/02	added example PortAccess.sc (regression test for bug fix)
# 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 \
		PortAccess.sc ImportInclude.sc ImportFile.sc HeaderFile.sc \
		Behaviors2.sc MultGen.sc DbgGen.sc DepTest.sc \
		alu_fct.sc shift_fct.sc alu.sc shift.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 \
		AnonEnum.sc LocalEvent.sc Piped.sc Signal.sc Buffered.sc \
		FSM3.sc FSM4.sc FSM5.sc FSM6.sc Wrapper.sc Pointer.sc \
		Handshake.sc \
		Signal2.sc Buffered2.sc Piped2.sc ClassConv.sc Fibonacci.sc \
		SigVectors.sc tanimoto1.sc tanimoto2.sc BufBus.sc BufSlice.sc \
		SigBus.sc SigSlice.sc SigBus2.sc SigBus2r.sc SigBus2f.sc \
		SigAdder.sc \
		OnesCounter_1_old.sc OnesCounter_4_old.sc \
		OnesCounter_4b_old.sc OnesCounter_1_new.sc \
		OnesCounter_4_new.sc OnesCounter_4a_new.sc \
		OnesCounter_M1_new.sc OnesCounter_M4_new.sc \
		OnesCounter_M4a_new.sc Fsmd.sc After.sc FctPtrBug.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
		

# set CCD macros
CCDDEFS	=	-DTHREAD_BASE=\"$(THREAD_BASE)\" \
		"-DCCD_CCSPCL=\"$(CCSPCL)\"" \
		-DGCC=\"$(GCC)\"


# --- 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) $(CCDDEFS) -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 core
	-$(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

distclean:	clean
	-$(RM) $(BINFILE)
	-$(RM) $(MANPAGE)


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 ---
