# Makefile: for Parser module
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# 09/26/06 PC   Adjustments for scrc 2.1
# RD 04/24/06	added regression tests PtrSub.sc, PtrSel.sc
# 06/15/04 PC   Adjustments for scrc 2.0
# RD 12/08/03	fixed check for HAVE_METHOD
# HY 12/04/03	added support for SIR_TYPE_METHOD
# RD 11/04/03	added flag AFTER to enable/disable support for 'after'
#		and 'piped' delayed assignments in the 'fsmd'
# RD 10/28/03	added example FctPtrBug.sc
# RD 10/03/03	added example After.sc
# RD 05/16/03	added passing of macros to the CcDriver
# 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/11/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 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/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	removed code not needed for the SCRC
# RD 05/23/01	added Init.sc example
# RD 05/22/01	added ClassAccess.sc example
# RD 05/04/01	added Import*.sc examples
# RD 05/04/01	made parser dependent on preprocessor (CcDriver)
# RD 05/04/01	set PRS_IMPORT_TMP_DIR from $(TMP)
# RD 04/23/01	added example Union.sc
# RD 04/20/01	added examples ExprEval.sc, Constructors.sc
# RD 04/18/01	added example Conv.sc
# RD 04/06/01	added -llonglong to the linker libraries
# RD 04/05/01	added Pipeline2.sc example
# RD 03/09/01	added option to create additional (shared/static) library
# AG 03/08/01	also create static library in shared lib environment
# RD 02/13/00	added Adder2.sc example (new port mapping features)
# RD 06/18/00	renamed String.h to GL_String.h
# RD 06/18/00	eliminated Makefile.macros (symb. link) in $SPECC/src
# AG 02/03/00	add dependency on String.h
# RD 05/19/99	added Japanese Kanji encoding support (PRS_Scanner.sed)
# RD 03/28/99	added support for shared libraries
# RD 03/08/99	added Pipeline.sc example
# RD 01/21/99	added Kanji.sc example
# RD 12/29/98	added Timing.sc example
# RD 12/22/98	added Device.sc example
# RD 12/06/98	added Empty.sc example
# RD 11/17/98	added Typical.sc example
# RD 09/09/98	added Adder.sc example
# RD 09/04/98	reactivated UserTypes.sc and Move.sc examples
# RD 06/02/98	added support for systems without symbolic links
# RD 05/14/98	added dependency from libbit.a
# RD 04/29/98	added Callback.sc example
# RD 03/20/98	added examples FSM2.sc and Behaviors.sc
# RD 02/24/98	don't make binary for target all
# RD 01/09/98	added FSM.sc example
# RD 11/07/97	added Notes.sc example
# RD 11/04/97	added Sizes.sc example
# RD 10/28/97	added DataTypes2.sc example
# RD 09/24/97	added dependency from IntRep module
# RD 09/11/97	updated examples
# RD 09/09/97	moved PRS_Scanner.c to PRS_Scanner.cc
# RD 08/30/97	introduction of ORIG file list
# RD 07/02/97	initial version
# ------------------------------------------------------------------------

# --- macros

include ../../Makefile.macros

MODULE	=	Parser
BINARY	=	prs_debug
BINFILE	=	$(BINARY)$(EXE_SUFFIX)
PREFIX	=	PRS_
LIBRARY	=	lib$(MODULE)
LIBOBJ	=	$(MODULE).o $(PREFIX)Scanner.o $(PREFIX)Parser.o
OBJECTS =	$(PREFIX)Scanner.o $(PREFIX)Parser.o
LIBDEP	=	$(SPECC_LIB)/libCcDriver.$(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 -lIntRep -lGlobal	\
		-l$(BIT_LIB_NAME) -l$(LLONG_LIB_NAME)
INCLUDE	=	$(MODULE).h $(PREFIX)Scanner.h $(SPECC_INC)/Global.h \
		$(SPECC_INC)/GL_String.h $(SPECC_INC)/CcDriver.h \
		$(SPECC_INC)/IntRep.h
EXAMPLE	=	HelloWorld.sc DataTypes.sc NewTypes.sc DataTypes2.sc T.sc \
		Typical.sc Sizes.sc Notes.sc Behaviors.sc FSM.sc FSM2.sc \
		L.sc R.sc UserTypes.sc Move.sc Callback.sc Netlist.sc \
		Empty.sc Adder.sc Device.sc Timing.sc Kanji.sc Pipeline.sc \
		Adder2.sc Pipeline2.sc Conv.sc ExprEval.sc Constructors.sc \
		Union.sc Import.sc ImportA.sc ImportA1.sc ImportA2.sc \
		ImportB.sc ImportB1.sc ImportB11.sc ImportB111.sc ImportC.sc \
		ClassAccess.sc Init.sc Pipeline3.sc CharTest.sc LongLong.sc \
		PortAccess.sc ImportInclude.sc ImportFile.sc HeaderFile.sc \
		AnonEnum.sc LocalEvent.sc Piped.sc FSM3.sc Behaviors2.sc \
		FSM4.sc FSM5.sc FSM6.sc Wrapper.sc Pointer.sc Handshake.sc \
		MultGen.sc DbgGen.sc Signal.sc Buffered.sc DepTest.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 alu_fct.sc shift_fct.sc alu.sc shift.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 PtrSub.sc PtrSel.sc 
DIST	=	$(MODULE).c $(MODULE).h Makefile .purify \
		$(PREFIX)Scanner.sed $(PREFIX)Scanner.h $(PREFIX)Parser.sed \
		$(EXAMPLE)
ORIG	=	$(MODULE).c $(MODULE).h Makefile \
		$(PREFIX)Scanner.sed $(PREFIX)Scanner.h $(PREFIX)Parser.sed \
		$(EXAMPLE)

# enable/disable support of "delta" keyword
DELTA	=	OFF
#DELTA	=	ON

# enable/disable support of "after" and "piped" keywords in FSMD
#AFTER	=	OFF
AFTER	=	ON

# set PRS_IMPORT_TMP_DIR
CCTMP	=	-DPRS_IMPORT_TMP_DIR=\"$(TMP)\"

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

# --- compilation rules

all:		$(LIBRARY).$(LIBSFX) $(SPECC_LIB)/$(LIBRARY).$(LIBSFX)


$(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)

$(LIBRARY).a:	$(LIBOBJ)
	$(RM) $(LIBRARY).a
	$(AR) $(LIBRARY).a $(LIBOBJ)
	$(RAN) $(LIBRARY).a
	if [ "$(ADDLIB)" = "so" ]; then					\
		$(MAKE) $(LIBRARY).so $(SPECC_LIB)/$(LIBRARY).so ;	\
		fi;

$(LIBRARY).so:	$(LIBOBJ)
	$(LNSO) -o $(LIBRARY).so $(LIBOBJ)
	if [ "$(ADDLIB)" = "a" ]; then					\
		$(MAKE) $(LIBRARY).a $(SPECC_LIB)/$(LIBRARY).a ;	\
		fi;

$(MODULE).o:	$(MODULE).c $(INCLUDE)
	$(CC) $(CCTMP) $(CCDDEFS) $(MODULE).c

$(BINARY).o:	$(MODULE).c $(INCLUDE)
	$(CC) $(CCTMP) $(CCDDEFS) $(DEBUG) -o $(BINARY).o $(MODULE).c

$(PREFIX)Scanner.o:	$(PREFIX)Scanner.cc $(PREFIX)Parser.h $(INCLUDE)
	$(YCC) $(CCTMP) $(CCDDEFS) -o $(PREFIX)Scanner.o $(PREFIX)Scanner.cc

$(PREFIX)Parser.o:	$(PREFIX)Parser.c $(INCLUDE)
	$(YCC) $(CCTMP) $(CCDDEFS) -o $(PREFIX)Parser.o $(PREFIX)Parser.c

$(PREFIX)Scanner.l:	$(PREFIX)Scanner.sed
	if [ "$(KANJI)" = "-DKANJI" ]; then				\
		$(SED) 's|^SED+KANJI||g;s|^SED-KANJI.*||g'		\
			< $(PREFIX)Scanner.sed > $(PREFIX)Scanner.sed2;	\
	else								\
		$(SED) 's|^SED-KANJI||g;s|^SED+KANJI.*||g'		\
			< $(PREFIX)Scanner.sed > $(PREFIX)Scanner.sed2;	\
	fi;
	if [ "$(AFTER)" = "ON" ]; then					\
		$(SED) 's|^SED+AFTER||g;s|^SED-AFTER.*||g'		\
			< $(PREFIX)Scanner.sed2 > $(PREFIX)Scanner.l ;	\
	else								\
		$(SED) 's|^SED-AFTER||g;s|^SED+AFTER.*||g'		\
			< $(PREFIX)Scanner.sed2 > $(PREFIX)Scanner.l ;	\
	fi;

$(PREFIX)Scanner.cc:	$(PREFIX)Scanner.l
	$(LEX) -P$(PREFIX) -t >$(PREFIX)Scanner.cc $(PREFIX)Scanner.l

$(PREFIX)Parser.y:      $(PREFIX)Parser.sed
	if [ "$(AFTER)" = "ON" ]; then					\
		$(SED) 's|^SED+AFTER||g;s|^SED-AFTER.*||g'		\
                        < $(PREFIX)Parser.sed > $(PREFIX)Parser.y ;	\
	else								\
                $(SED) 's|^SED-AFTER||g;s|^SED+AFTER.*||g'		\
                        < $(PREFIX)Parser.sed > $(PREFIX)Parser.y ;	\
	fi;

$(PREFIX)Parser.c $(PREFIX)Parser.h:	$(PREFIX)Parser.y
	$(YACC) -p $(PREFIX) -o $(PREFIX)Parser.c $(PREFIX)Parser.y

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

# if there is no symbolic link already, create a copy in the public directory
$(SPECC_LIB)/$(LIBRARY).so:	$(LIBRARY).so
	$(CP) $(LIBRARY).so $(SPECC_LIB)


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


# --- service rules

clean:
	-$(RM) *.bak *.BAK *~
	-$(RM) *.o core
	-$(RM) $(PREFIX)Scanner.cc $(PREFIX)Scanner.l \
		$(PREFIX)Scanner.sed2 $(PREFIX)Scanner.sed3 \
		$(PREFIX)Parser.c $(PREFIX)Parser.y \
		$(PREFIX)Parser.sed2 $(PREFIX)Parser.h \
		$(PREFIX)Parser.sed3 $(PREFIX)Parser.output
	-$(RM) *.si *.sc.2 *.si.2 *.sc.3
	-$(RM) *.pure* *_pure* .pure

distclean:	clean
	-$(RM) $(BINFILE) $(LIBRARY).*


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

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

test:		$(BINFILE) $(EXAMPLE)
	set -e;								\
	for ex in $(EXAMPLE); do					\
	$(SCPP) -C $$ex -o `basename $$ex .sc`.si;			\
	SPECC=$(SPECC) ./$(BINFILE) `basename $$ex .sc`.si $$ex.2;	\
	$(SCPP) -C $$ex.2 -o `basename $$ex .sc`.si.2;			\
	SPECC=$(SPECC) ./$(BINFILE) `basename $$ex .sc`.si.2 $$ex.3;	\
	done

pure:		$(BINARY)_pure

puretest:	$(BINARY)_pure $(EXAMPLE)
	set -e;								\
	for ex in $(EXAMPLE); do					\
	$(SCPP) -C $$ex -o `basename $$ex .sc`.si;			\
	SPECC=$(SPECC) ./$(BINARY)_pure `basename $$ex .sc`.si $$ex.2;	\
	$(SCPP) -C $$ex.2 -o `basename $$ex .sc`.si.2;			\
	SPECC=$(SPECC) ./$(BINARY)_pure `basename $$ex .sc`.si.2 $$ex.3;\
	done


# --- EOF Makefile ---
