# ------------------------------------------------------------------------
# Makefile: for Parser module
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# 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
DIST	=	$(MODULE).c $(MODULE).h Makefile .purify \
		$(PREFIX)Scanner.sed $(PREFIX)Scanner.h $(PREFIX)Parser.y \
		$(EXAMPLE)
ORIG	=	$(MODULE).c $(MODULE).h Makefile \
		$(PREFIX)Scanner.sed $(PREFIX)Scanner.h $(PREFIX)Parser.y \
		$(EXAMPLE)

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


# --- 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) $(MODULE).c

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

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

$(PREFIX)Parser.o:	$(PREFIX)Parser.c $(INCLUDE)
	$(YCC) $(CCTMP) -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.l;	\
	else								\
		$(SED) 's|^SED-KANJI||g;s|^SED+KANJI.*||g'		\
			< $(PREFIX)Scanner.sed > $(PREFIX)Scanner.l;	\
	fi;

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

$(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 $(BINFILE) $(LIBRARY).* core
	-$(RM) $(PREFIX)Scanner.cc $(PREFIX)Scanner.l \
		$(PREFIX)Parser.c $(PREFIX)Parser.h \
		$(PREFIX)Parser.output
	-$(RM) *.si *.sc.2 *.si.2 *.sc.3
	-$(RM) *.pure* *_pure* .pure

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;	\
	./$(BINFILE) `basename $$ex .sc`.si $$ex.2;	\
	$(SCPP) -C $$ex.2 -o `basename $$ex .sc`.si.2;	\
	./$(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;	\
	./$(BINARY)_pure `basename $$ex .sc`.si $$ex.2;	\
	$(SCPP) -C $$ex.2 -o `basename $$ex .sc`.si.2;	\
	./$(BINARY)_pure `basename $$ex .sc`.si.2 $$ex.3;	\
	done


# --- EOF Makefile ---
