# ------------------------------------------------------------------------
# Makefile: for SpecC Internal Representation module
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# RD 09/25/04	support for compilation on different architectures (ARCH)
# 06/15/04 PC   Adjustments for scrc 2.0
# RD 09/12/03	added files DelydAssgn.cc and IntRep/DelydAssgn.h
# RD 05/01/03	compile Alignment with implicit templates
# RD 02/03/03	added FsmdStmnt.[cc|h] and FsmdState.[cc|h]
# RD 11/22/02	added Event.cc and IntRep/Event.h
# RD 10/03/02	separated 'clean' target into 'clean' and 'distclean'
# RD 11/15/01	added dependency on GL_FileIO.h and GL_System.h;
#		added missing $(EXE_SUFFIX) in 'clean' target
# RD 09/20/01	adjusted include files for Symbol.cc
# RD 05/30/01	eliminated level 2 of SIR API
# RD 05/25/01	eliminated support for binary SIR files (import/export)
# RD 05/25/01	reduced contents to SCRC requirements
# ------------------------------------------------------------------------

# --- macros

include ../../Makefile.macros

MODULE	=	IntRep
BINARY	=	sir_debug
BINFILE	=	$(BINARY)$(EXE_SUFFIX)
PREFIX	=	SIR_
LIBRARY	=	lib$(MODULE)
LIBOBJ	=	Error.o Unit.o List.o FileInfo.o Import.o Node.o Constant.o \
		Note.o Initializer.o Parameter.o PortMap.o Type.o \
		Expression.o Exception.o Label.o Constraint.o Transition.o \
		Statement.o FsmdState.o FsmdStmnt.o DelydAssgn.o \
		Member.o UserType.o Symbol.o Event.o \
		BasicType.o Declarator.o \
		Design.o
OBJECTS =	Error.o Unit.o List.o FileInfo.o Import.o Node.o Constant.o \
		Note.o Initializer.o Parameter.o PortMap.o Type.o \
		Expression.o Exception.o Label.o Constraint.o Transition.o \
		Statement.o FsmdState.o FsmdStmnt.o DelydAssgn.o \
		Member.o UserType.o Symbol.o Event.o \
		Design.o
LIBDEP	=	$(SPECC_LIB)/libGlobal.$(LIBSFX)	\
		$(SPECC_LIB)/lib$(BIT_LIB_NAME).$(LIBSFX)	\
		$(SPECC_LIB)/lib$(LLONG_LIB_NAME).$(LIBSFX)
LIBS	=	-lGlobal -l$(BIT_LIB_NAME) -l$(LLONG_LIB_NAME)
SYMBINC	=	$(MODULE)/Error.h $(MODULE)/Unit.h $(MODULE)/List.h \
		$(MODULE)/List2.h $(MODULE)/FileInfo.h $(MODULE)/Import.h \
		$(MODULE)/Node.h $(MODULE)/Constant.h $(MODULE)/Note.h \
		$(MODULE)/Initializer.h $(MODULE)/Parameter.h \
		$(MODULE)/PortMap.h $(MODULE)/Type.h $(MODULE)/Expression.h \
		$(MODULE)/Exception.h $(MODULE)/Event.h $(MODULE)/Label.h \
		$(MODULE)/Constraint.h $(MODULE)/Transition.h \
		$(MODULE)/Statement.h $(MODULE)/FsmdState.h \
		$(MODULE)/FsmdStmnt.h $(MODULE)/DelydAssgn.h \
		$(MODULE)/Member.h $(MODULE)/UserType.h \
		$(MODULE)/Symbol.h $(MODULE)/Extern.h $(SPECC_INC)/Global.h \
		$(SPECC_INC)/GL_String.h $(SPECC_INC)/GL_FileIO.h \
		$(SPECC_INC)/GL_System.h $(SPECC_INC)/sys/bit.h
LVL2INC	=	$(MODULE)/Design.h
INCLUDE	=	$(SYMBINC) $(LVL2INC)
EXAMPLE	=
DIST	=	$(MODULE).cc $(MODULE).h Makefile .purify \
		Error.c $(MODULE)/Error.h \
		Unit.cc $(MODULE)/Unit.h \
		List.cc $(MODULE)/List.h $(MODULE)/List2.h \
		FileInfo.cc $(MODULE)/FileInfo.h \
		Import.cc $(MODULE)/Import.h \
		Node.cc $(MODULE)/Node.h \
		Constant.cc $(MODULE)/Constant.h \
		Note.cc $(MODULE)/Note.h \
		Initializer.cc $(MODULE)/Initializer.h \
		Parameter.cc $(MODULE)/Parameter.h \
		PortMap.cc $(MODULE)/PortMap.h \
		Type.cc $(MODULE)/Type.h \
		Expression.cc $(MODULE)/Expression.h \
		Exception.cc $(MODULE)/Exception.h \
		Label.cc $(MODULE)/Label.h \
		Constraint.cc $(MODULE)/Constraint.h \
		Transition.cc $(MODULE)/Transition.h \
		Statement.cc $(MODULE)/Statement.h \
		FsmdState.cc $(MODULE)/FsmdState.h \
		FsmdStmnt.cc $(MODULE)/FsmdStmnt.h \
		DelydAssgn.cc $(MODULE)/DelydAssgn.h \
		Member.cc $(MODULE)/Member.h \
		UserType.cc $(MODULE)/UserType.h \
		Symbol.cc $(MODULE)/Symbol.h \
		Event.cc $(MODULE)/Event.h \
		BasicType.cc $(MODULE)/BasicType.h \
		Declarator.cc $(MODULE)/Declarator.h \
		Design.cc $(MODULE)/Design.h \
		$(MODULE)/Extern.h \
		Alignment.cc
ORIG	=	$(MODULE).cc $(MODULE).h Makefile \
		Error.c $(MODULE)/Error.h \
		Unit.cc $(MODULE)/Unit.h \
		List.cc $(MODULE)/List.h $(MODULE)/List2.h \
		FileInfo.cc $(MODULE)/FileInfo.h \
		Import.cc $(MODULE)/Import.h \
		Node.cc $(MODULE)/Node.h \
		Constant.cc $(MODULE)/Constant.h \
		Note.cc $(MODULE)/Note.h \
		Initializer.cc $(MODULE)/Initializer.h \
		Parameter.cc $(MODULE)/Parameter.h \
		PortMap.cc $(MODULE)/PortMap.h \
		Type.cc $(MODULE)/Type.h \
		Expression.cc $(MODULE)/Expression.h \
		Exception.cc $(MODULE)/Exception.h \
		Label.cc $(MODULE)/Label.h \
		Constraint.cc $(MODULE)/Constraint.h \
		Transition.cc $(MODULE)/Transition.h \
		Statement.cc $(MODULE)/Statement.h \
		FsmdState.cc $(MODULE)/FsmdState.h \
		FsmdStmnt.cc $(MODULE)/FsmdStmnt.h \
		DelydAssgn.cc $(MODULE)/DelydAssgn.h \
		Member.cc $(MODULE)/Member.h \
		UserType.cc $(MODULE)/UserType.h \
		Symbol.cc $(MODULE)/Symbol.h \
		Event.cc $(MODULE)/Event.h \
		BasicType.cc $(MODULE)/BasicType.h \
		Declarator.cc $(MODULE)/Declarator.h \
		Design.cc $(MODULE)/Design.h \
		$(MODULE)/Extern.h \
		Alignment.cc


# --- compilation rules

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


$(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).cc $(MODULE).h $(INCLUDE)
	$(CC) $(MODULE).cc


$(BINARY)1$(EXE_SUFFIX):	$(BINARY)1.o $(OBJECTS) $(LIBDEP)
	$(LN) -o $(BINARY)1$(EXE_SUFFIX) $(BINARY)1.o \
		$(OBJECTS) $(LIBS) $(STDLIB)

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

$(BINARY)1.o:	$(MODULE).cc $(MODULE).h $(INCLUDE)
	$(CC) $(DEBUG) -DSIR_PERFORM_TEST_1 -o $(BINARY)1.o $(MODULE).cc


$(BINARY)2$(EXE_SUFFIX):	$(BINARY)2.o $(OBJECTS) $(LIBDEP)
	$(LN) -o $(BINARY)2$(EXE_SUFFIX) $(BINARY)2.o \
		$(OBJECTS) $(LIBS) $(STDLIB)

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

$(BINARY)2.o:	$(MODULE).cc $(MODULE).h $(INCLUDE)
	$(CC) $(DEBUG) -DSIR_PERFORM_TEST_2 -o $(BINARY)2.o $(MODULE).cc


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

$(SPECC_LIB)/$(LIBRARY).so:	$(LIBRARY).so
	$(CP) $(LIBRARY).so $(SPECC_LIB)


Alignment.o:	Alignment.cc $(SPECC_INC)/bit.h $(SPECC_INC)/specc.h
	$(GCC) $(SYSTEM) $(ARCH) $(OPTIM) $(CCSPCL) $(DYNLIB) $(KANJI) \
		$(LLONG) $(ARYASN) $(CCDBG) $(CCSLIB) -c -Wall -I$(SPECC_INC) \
		Alignment.cc

Alignment$(EXE_SUFFIX):	Alignment.o $(LIBDEP) \
			$(SPECC_LIB)/libsim.$(LIBSFX)
	$(LN) -o Alignment$(EXE_SUFFIX) Alignment.o	\
		-l$(SIM_LIB_NAME) $(LIBS) -l$(THREAD_BASE) $(STDLIB)

Alignment.h:		Alignment$(EXE_SUFFIX)
	LD_LIBRARY_PATH=$(SPECC_LIB)$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
		./Alignment$(EXE_SUFFIX) >Alignment.h


# --- submodules

Error.o:	$(SPECC_INC)/Global.h $(SPECC_INC)/GL_String.h \
		Error.c $(MODULE)/Error.h
	$(CC) Error.c

Unit.o:		$(SPECC_INC)/Global.h $(MODULE)/Error.h \
		Unit.cc $(MODULE)/Unit.h
	$(CC) Unit.cc

List.o:		List.cc $(INCLUDE)
	$(CC) List.cc

FileInfo.o:	FileInfo.cc $(INCLUDE)
	$(CC) FileInfo.cc

Import.o:	Import.cc $(INCLUDE)
	$(CC) Import.cc

Node.o:		$(SPECC_INC)/Global.h $(MODULE)/Error.h $(MODULE)/Unit.h \
		$(MODULE)/List.h $(MODULE)/List2.h $(MODULE)/FileInfo.h \
		Node.cc $(MODULE)/Node.h
	$(CC) Node.cc

Constant.o:	$(SPECC_INC)/Global.h $(MODULE)/Error.h $(MODULE)/Unit.h \
		$(MODULE)/List.h $(MODULE)/List2.h $(MODULE)/FileInfo.h \
		$(MODULE)/Node.h $(MODULE)/Extern.h $(SPECC_INC)/sys/bit.h \
		Constant.cc $(MODULE)/Constant.h $(SPECC_INC)/GL_String.h
	$(CC) Constant.cc

Note.o:		Note.cc $(SYMBINC)
	$(CC) Note.cc

Initializer.o:	$(SPECC_INC)/Global.h $(MODULE)/Error.h $(MODULE)/Unit.h \
		$(MODULE)/List.h $(MODULE)/List2.h $(MODULE)/FileInfo.h \
		$(MODULE)/Node.h $(MODULE)/Constant.h $(SPECC_INC)/sys/bit.h \
		Initializer.cc $(MODULE)/Initializer.h $(SPECC_INC)/GL_String.h
	$(CC) Initializer.cc

Parameter.o:	Parameter.cc $(SYMBINC)
	$(CC) Parameter.cc

PortMap.o:	PortMap.cc $(SYMBINC)
	$(CC) PortMap.cc

Type.o:		Type.cc $(INCLUDE) $(MODULE)/BasicType.h \
		Alignment.h
	$(CC) Type.cc

Expression.o:	Expression.cc $(SYMBINC)
	$(CC) Expression.cc

Exception.o:	Exception.cc $(INCLUDE)
	$(CC) Exception.cc

Label.o:	Label.cc $(SYMBINC)
	$(CC) Label.cc

Constraint.o:	Constraint.cc $(INCLUDE)
	$(CC) Constraint.cc

Transition.o:	Transition.cc $(INCLUDE)
	$(CC) Transition.cc

Statement.o:	Statement.cc $(INCLUDE)
	$(CC) Statement.cc

FsmdState.o:	FsmdState.cc $(INCLUDE)
	$(CC) FsmdState.cc

FsmdStmnt.o:	FsmdStmnt.cc $(INCLUDE)
	$(CC) FsmdStmnt.cc

DelydAssgn.o:	DelydAssgn.cc $(INCLUDE)
	$(CC) DelydAssgn.cc

Member.o:	Member.cc $(SYMBINC)
	$(CC) Member.cc

UserType.o:	UserType.cc $(SYMBINC)
	$(CC) UserType.cc

Symbol.o:	Symbol.cc $(MODULE)/Declarator.h $(MODULE)/BasicType.h \
		$(INCLUDE) Alignment.h
	$(CC) Symbol.cc

Event.o:	Event.cc $(INCLUDE)
	$(CC) Event.cc

BasicType.o:	BasicType.cc $(MODULE)/BasicType.h $(SYMBINC)
	$(CC) BasicType.cc

Declarator.o:	Declarator.cc $(MODULE)/Declarator.h $(MODULE)/BasicType.h \
		$(SYMBINC)
	$(CC) Declarator.cc

Design.o:	Design.cc $(INCLUDE)
	$(CC) Design.cc


# --- external sources

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

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


# --- service rules

clean:
	-$(RM) *.bak *.BAK *~
	-$(RM) $(MODULE)/*.bak $(MODULE)/*.BAK $(MODULE)/*~
	-$(RM) *.o core
	-$(RM) *.pure* *_pure* .pure
	-$(RM) $(BINARY)*$(EXE_SUFFIX)
	-$(RM) HelloWorld*.sc
	-$(RM) Alignment.h Alignment.o Alignment$(EXE_SUFFIX)

distclean:	clean
	-$(RM) $(LIBRARY).*
	-$(RM) $(BINARY)*$(EXE_SUFFIX)
	-$(RM) Alignment.h Alignment$(EXE_SUFFIX)


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

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

test:		$(BINARY)1$(EXE_SUFFIX) $(BINARY)2$(EXE_SUFFIX)
	./$(BINARY)1
	./$(BINARY)2

pure:		$(BINARY)1_pure $(BINARY)2_pure

puretest:	pure
	./$(BINARY)1_pure
	./$(BINARY)2_pure


# --- EOF Makefile ---
