# ------------------------------------------------------------------------
# Makefile: top-level Makefile for the SpecC Reference Compiler
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# RD 06/23/04	removed symbolic links with version number in lib directory
# PC 06/21/04	Added support for creating symbolic links
# RD 06/17/04	fixes for release 2.0
# RD 05/30/03	remove sym-links before creation so that 'make install' works
#		even if installation already exists
# RD 05/15/03	allow inc/sim.h in dist2
# RD 04/03/03	include uninstall target in ALL target (needed on Linux)
# RD 04/02/03	don't leave temporary file $(FILES) in $(TMP)
# RD 11/04/02	replaced doc/SpecC_LRM.ps (v1.0) with doc/SpecC_LRM.pdf (v2.0)
# RD 10/03/02	separated 'clean' target into 'clean' and 'distclean'
# RD 09/16/02	reworked the 'install' and 'uninstall' targets
# RD 02/27/02	added signals.h (support of 'buffered' and 'signal' types)
# RD 02/18/02	added support for [double_]handshake channels
# RD 02/14/02	added support for channels 'queue' and 'typed_queue'
# RD 02/13/02	added support for new 'examples/sync' directory
# RD 02/12/02	added support for import directory
# RD 12/28/01	added targets 'testall' and 'cleanall' to include examples;
#		added target 'ALL' to do really all;
#		removed incomplete and obsolete target 'install-devel'
# RD 11/07/01	moved inc directory up before src for targets all and clean
# RD 11/15/01	added GL_System.h
# RD 11/12/01	added GL_FileIO.h to 'install-devel'
# RD 06/08/01	added LICENSE file
# RD 06/01/01	fixed dist2 target for linux
# RD 06/01/01	removed unused obj directory
# AG 05/31/01	Added scrc.spec file to list of originals
# RD 05/25/01	renamed 'scc' to 'scrc'
# RD 05/24/01	reduced contents to SCRC requirements
# ------------------------------------------------------------------------

include Makefile.macros


# --- some local macros

FILES		= FILES
ORIGINALS	= ORIGINALS
PACKAGE		= $(PROJECT).tar.gz
PACKAGE2	= $(PROJECT)-2.tar.gz
PACKAGE3	= $(PROJECT)-3.tar.gz
BINPACK		= $(PROJECT)-bin.tar.gz


# --- files and directories to be included in the distribution
#     (files listed in sub-Makefiles will be added)

DIST	=	COPYRIGHT	\
		LICENSE		\
		FILES	\
		HISTORY	\
		INSTALL	\
		INSTALL.BIN	\
		README	\
		README.BIN	\
		TODO	\
		BUGS	\
		Makefile	\
		Makefile.macros \
		scrc.spec


# --- files that were created manually (original files)
#     (files listed in sub-Makefiles will be added)

ORIG	=	COPYRIGHT	\
		LICENSE		\
		HISTORY	\
		INSTALL	\
		INSTALL.BIN	\
		README	\
		README.BIN	\
		TODO	\
		BUGS	\
		Makefile	\
		Makefile.macros \
		scrc.spec


# --- files to be additionally included in the dist2 distribution
#     (files which are hard to recreate on Windows platform)

DIST2	=	$$empty


# --- files to be excluded in the dist2 distribution
#     (symbolic links pointing to not-yet-existing files)

NODIST2	=	bin/scrc		\
		inc/GL_System.h		\
		inc/bit.h		\
		inc/sys/bit.h		\
		inc/longlong.h		\
		inc/limits.sh		\
		lib/libCcDriver.a	\
		lib/libCcDriver.so	\
		lib/libGlobal.a		\
		lib/libGlobal.so	\
		lib/libIntRep.a		\
		lib/libIntRep.so	\
		lib/libParser.a		\
		lib/libParser.so	\
		lib/liblonglong.a	\
		lib/liblonglong.so	\
		lib/libbit.a		\
		lib/libbit.so		\
		lib/libsim.a		\
		lib/libsim.so		\
		man/manl/scrc.l

# PC: Various directory bases. As of now used in symbolic link creation

SLINK_TOP_EX_BASE 	= ./examples
SLINK_TOP_IMP_BASE 	= ./import
SLINK_LIB_BASE 		= ./lib
SLINK_BIN_BASE 		= ./bin
SLINK_INC_BASE 		= ./inc
SLINK_MANL_BASE		= ./man/manl
SLINK_PRS_BASE 		= ./src/Parser
SLINK_SYNC_BASE 	= ./src/sync
SLINK_SIM_BASE 		= ./src/sim
SLINK_GLB_BASE 		= ./src/Global
SLINK_CCD_BASE 		= ./src/CcDriver
SLINK_CMP_BASE 		= ./src/Compiler
SLINK_BIT_BASE 		= ./src/bit
SLINK_LL_BASE 		= ./src/longlong
SLINK_INTRP_BASE 	= ./src/IntRep

SLINK_SRC_EX_SIMP	= ../../../examples/simple
SLINK_SRC_PRS		= ../Parser
SLINK_SRC_SYNC		= ../src/sync
SLINK_SRC_SIM		= ../src/sim
SLINK_SRC_LL		= ../src/longlong
SLINK_SRC_GLB		= ../src/Global
SLINK_SRC_CCD		= ../src/CcDriver
SLINK_SRC_INTRP		= ../src/IntRep
SLINK_SRC_BIT		= ../src/bit

#PC sources of the symbolic links to be created in respective directories
#Target directories depends on the list be considered. Look at the for
#loops below.
SYMLINKS_CMP_EX =	$(SLINK_SRC_EX_SIMP)/Timing.sc			\
			$(SLINK_SRC_EX_SIMP)/Pipeline2.sc		\
			$(SLINK_SRC_EX_SIMP)/Pipeline.sc		\
			$(SLINK_SRC_EX_SIMP)/Notes.sc			\
			$(SLINK_SRC_EX_SIMP)/HelloWorld.sc		\
			$(SLINK_SRC_EX_SIMP)/Handshaking2.sc		\
			$(SLINK_SRC_EX_SIMP)/Handshaking1.sc		\
			$(SLINK_SRC_EX_SIMP)/FSM.sc			\
			$(SLINK_SRC_EX_SIMP)/Exception.sc		\
			$(SLINK_SRC_EX_SIMP)/DataTypes.sc		\
			$(SLINK_SRC_EX_SIMP)/Callback.sc		\
			$(SLINK_SRC_EX_SIMP)/BitVectors.sc		\
			$(SLINK_SRC_EX_SIMP)/Behaviors.sc		\
			$(SLINK_SRC_EX_SIMP)/Adder.sc

SYMLINKS_CMP	=	$(SLINK_SRC_PRS)/Union.sc			\
			$(SLINK_SRC_PRS)/UserTypes.sc			\
			$(SLINK_SRC_PRS)/Typical.sc			\
			$(SLINK_SRC_PRS)/Timing.sc			\
			$(SLINK_SRC_PRS)/T.sc				\
			$(SLINK_SRC_PRS)/Sizes.sc			\
			$(SLINK_SRC_PRS)/R.sc				\
			$(SLINK_SRC_PRS)/PortAccess.sc			\
			$(SLINK_SRC_PRS)/Pipeline3.sc			\
			$(SLINK_SRC_PRS)/Pipeline2.sc			\
			$(SLINK_SRC_PRS)/Pipeline.sc			\
			$(SLINK_SRC_PRS)/Notes.sc			\
			$(SLINK_SRC_PRS)/NewTypes.sc			\
			$(SLINK_SRC_PRS)/Netlist.sc			\
			$(SLINK_SRC_PRS)/Move.sc			\
			$(SLINK_SRC_PRS)/LongLong.sc			\
			$(SLINK_SRC_PRS)/L.sc				\
			$(SLINK_SRC_PRS)/Kanji.sc			\
			$(SLINK_SRC_PRS)/Init.sc			\
			$(SLINK_SRC_PRS)/ImportInclude.sc		\
			$(SLINK_SRC_PRS)/ImportFile.sc			\
			$(SLINK_SRC_PRS)/HelloWorld.sc			\
			$(SLINK_SRC_PRS)/HeaderFile.sc			\
			$(SLINK_SRC_PRS)/FSM6.sc			\
			$(SLINK_SRC_PRS)/FSM5.sc			\
			$(SLINK_SRC_PRS)/FSM4.sc			\
			$(SLINK_SRC_PRS)/FSM2.sc			\
			$(SLINK_SRC_PRS)/FSM.sc				\
			$(SLINK_SRC_PRS)/ExprEval.sc			\
			$(SLINK_SRC_PRS)/Empty.sc			\
			$(SLINK_SRC_PRS)/Device.sc			\
			$(SLINK_SRC_PRS)/DataTypes2.sc			\
			$(SLINK_SRC_PRS)/DataTypes.sc			\
			$(SLINK_SRC_PRS)/Conv.sc			\
			$(SLINK_SRC_PRS)/Constructors.sc		\
			$(SLINK_SRC_PRS)/ClassAccess.sc			\
			$(SLINK_SRC_PRS)/CharTest.sc			\
			$(SLINK_SRC_PRS)/Callback.sc			\
			$(SLINK_SRC_PRS)/Behaviors.sc			\
			$(SLINK_SRC_PRS)/AnonEnum.sc			\
			$(SLINK_SRC_PRS)/Adder2.sc			\
			$(SLINK_SRC_PRS)/Adder.sc			\
			$(SLINK_SRC_PRS)/tanimoto2.sc			\
			$(SLINK_SRC_PRS)/tanimoto1.sc			\
			$(SLINK_SRC_PRS)/shift_fct.sc			\
			$(SLINK_SRC_PRS)/shift.sc			\
			$(SLINK_SRC_PRS)/alu_fct.sc			\
			$(SLINK_SRC_PRS)/alu.sc				\
			$(SLINK_SRC_PRS)/Wrapper.sc			\
			$(SLINK_SRC_PRS)/Signal2.sc			\
			$(SLINK_SRC_PRS)/Signal.sc			\
			$(SLINK_SRC_PRS)/SigVectors.sc			\
			$(SLINK_SRC_PRS)/SigSlice.sc			\
			$(SLINK_SRC_PRS)/SigBus2r.sc			\
			$(SLINK_SRC_PRS)/SigBus2f.sc			\
			$(SLINK_SRC_PRS)/SigBus2.sc			\
			$(SLINK_SRC_PRS)/SigBus.sc			\
			$(SLINK_SRC_PRS)/SigAdder.sc			\
			$(SLINK_SRC_PRS)/Pointer.sc			\
			$(SLINK_SRC_PRS)/Piped2.sc			\
			$(SLINK_SRC_PRS)/Piped.sc			\
			$(SLINK_SRC_PRS)/OnesCounter_M4a_new.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_M4_new.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_M1_new.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_4b_old.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_4a_new.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_4_old.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_4_new.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_1_old.sc		\
			$(SLINK_SRC_PRS)/OnesCounter_1_new.sc		\
			$(SLINK_SRC_PRS)/MultGen.sc			\
			$(SLINK_SRC_PRS)/LocalEvent.sc			\
			$(SLINK_SRC_PRS)/Handshake.sc			\
			$(SLINK_SRC_PRS)/Fsmd.sc			\
			$(SLINK_SRC_PRS)/Fibonacci.sc			\
			$(SLINK_SRC_PRS)/FctPtrBug.sc			\
			$(SLINK_SRC_PRS)/FSM3.sc			\
			$(SLINK_SRC_PRS)/DepTest.sc			\
			$(SLINK_SRC_PRS)/DbgGen.sc			\
			$(SLINK_SRC_PRS)/ClassConv.sc			\
			$(SLINK_SRC_PRS)/Buffered2.sc			\
			$(SLINK_SRC_PRS)/Buffered.sc			\
			$(SLINK_SRC_PRS)/BufSlice.sc			\
			$(SLINK_SRC_PRS)/BufBus.sc			\
			$(SLINK_SRC_PRS)/Behaviors2.sc			\
			$(SLINK_SRC_PRS)/After.sc

SYMLINKS_IMP	=	$(SLINK_SRC_SYNC)/i_tranceiver.sc		\
			$(SLINK_SRC_SYNC)/i_token.sc			\
			$(SLINK_SRC_SYNC)/i_sender.sc			\
			$(SLINK_SRC_SYNC)/i_send.sc			\
			$(SLINK_SRC_SYNC)/i_semaphore.sc		\
			$(SLINK_SRC_SYNC)/i_receiver.sc			\
			$(SLINK_SRC_SYNC)/i_receive.sc			\
			$(SLINK_SRC_SYNC)/i_producer.sc			\
			$(SLINK_SRC_SYNC)/i_critical_section.sc		\
			$(SLINK_SRC_SYNC)/i_consumer.sc			\
			$(SLINK_SRC_SYNC)/i_barrier.sc			\
			$(SLINK_SRC_SYNC)/c_token.sc			\
			$(SLINK_SRC_SYNC)/c_semaphore.sc		\
			$(SLINK_SRC_SYNC)/c_queue.sc			\
			$(SLINK_SRC_SYNC)/c_mutex.sc			\
			$(SLINK_SRC_SYNC)/c_handshake.sc		\
			$(SLINK_SRC_SYNC)/c_double_handshake.sc		\
			$(SLINK_SRC_SYNC)/c_critical_section.sc		\
			$(SLINK_SRC_SYNC)/c_barrier.sc

SYMLINKS_INC	= 	$(SLINK_SRC_SIM)/specc.h			\
			$(SLINK_SRC_SIM)/sim.sh				\
			$(SLINK_SRC_SIM)/sim.h				\
			$(SLINK_SRC_SIM)/signals.h			\
			$(SLINK_SRC_SIM)/piped.h			\
			$(SLINK_SRC_LL)/longlong.h			\
			$(SLINK_SRC_LL)/limits.sh			\
			$(SLINK_SRC_SYNC)/i_typed_tranceiver.sh		\
			$(SLINK_SRC_SYNC)/i_typed_sender.sh		\
			$(SLINK_SRC_SYNC)/i_typed_receiver.sh		\
			$(SLINK_SRC_SYNC)/c_typed_queue.sh		\
			$(SLINK_SRC_SYNC)/c_typed_double_handshake.sh	\
			$(SLINK_SRC_BIT)/bit.h				\
			$(SLINK_SRC_INTRP)/IntRep.h			\
			$(SLINK_SRC_INTRP)/IntRep			\
			$(SLINK_SRC_GLB)/Global.h			\
			$(SLINK_SRC_GLB)/GL_System.h			\
			$(SLINK_SRC_GLB)/GL_String.h			\
			$(SLINK_SRC_GLB)/GL_FileIO.h			\
			$(SLINK_SRC_CCD)/CcDriver.h			\
			../src/Parser/Parser.h

SYMLINKS_LIB	=	$(SLINK_SRC_SIM)/libsim.so			\
			$(SLINK_SRC_SIM)/libsim.a			\
			$(SLINK_SRC_LL)/liblonglong.so			\
			$(SLINK_SRC_LL)/liblonglong.a			\
			$(SLINK_SRC_BIT)/libbit.so			\
			$(SLINK_SRC_BIT)/libbit.a			\
			../src/Parser/libParser.so			\
			../src/Parser/libParser.a			\
			$(SLINK_SRC_INTRP)/libIntRep.so			\
			$(SLINK_SRC_INTRP)/libIntRep.a			\
			$(SLINK_SRC_GLB)/libGlobal.so			\
			$(SLINK_SRC_GLB)/libGlobal.a			\
			$(SLINK_SRC_CCD)/libCcDriver.so			\
			$(SLINK_SRC_CCD)/libCcDriver.a

SYMLINKS_BIN	=	../src/scrc

SYMLINKS_MAN	=	../../src/Compiler/scrc.l

SYMLINKS_INCSYS	=	../../src/bit/sys/bit.h

SYMLINKS_PURIFY	=	../.purify


# --- rules

all:
	cd man		; $(MAKE) dirs
	cd inc		; $(MAKE) all
	cd import	; $(MAKE) all
	cd src		; $(MAKE) all
	cd lib		; $(MAKE) all
	cd bin		; $(MAKE) all
	cd man		; $(MAKE) all
	cd doc		; $(MAKE) all
	cd examples	; $(MAKE) all

ALL:
	$(MAKE) cleanall
	$(MAKE) uninstall
	$(MAKE) dist
	$(MAKE) dist2
	$(MAKE) dist3
	$(MAKE) all
	$(MAKE) install
	$(MAKE) bindist
	$(MAKE) testall
	$(MAKE) wc
	$(MAKE) chmod

chmod:
	$(CHGRP) -R $(FILE_GROUP) *
	$(CHMOD) -R $(FILE_PERM) *

clean:
	-$(RM) core *.bak *.BAK *~
	-$(RM) `find . -name ".#*"`
	cd inc		; $(MAKE) clean
	cd import       ; $(MAKE) clean
	cd src		; $(MAKE) clean
	cd lib		; $(MAKE) clean
	cd bin		; $(MAKE) clean
	cd man		; $(MAKE) clean
	cd doc		; $(MAKE) clean
	cd examples	; $(MAKE) clean

distclean:
	-$(RM) core *.bak *.BAK *~
	-$(RM) `find . -name ".#*"`
	cd inc		; $(MAKE) distclean
	cd import	; $(MAKE) distclean
	cd src		; $(MAKE) distclean
	cd lib		; $(MAKE) distclean
	cd bin		; $(MAKE) distclean
	cd man		; $(MAKE) distclean
	cd doc		; $(MAKE) distclean
	cd examples	; $(MAKE) distclean

cleanall:	distclean
	cd examples	; $(MAKE) cleanall
	-$(RM) $(FILES)
	-$(RM) $(ORIGINALS)
	-$(RM) $(PACKAGE)
	-$(RM) $(PACKAGE2)
	-$(RM) $(PACKAGE3)
	-$(RM) $(BINPACK)

dist:		chmod
	-$(RM) $(FILES) $(PACKAGE)
	for file in $(DIST); do echo $$file >>$(SPECC_HOME)/$(FILES); done
	cd bin	;	\
		$(MAKE) DISTPREFIX=bin	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd doc	;	\
		$(MAKE) DISTPREFIX=doc	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd examples;	\
		$(MAKE) DISTPREFIX=examples	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd inc	;	\
		$(MAKE) DISTPREFIX=inc	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd import;	\
		$(MAKE) DISTPREFIX=import	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd lib	;	\
		$(MAKE) DISTPREFIX=lib	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd man	;	\
		$(MAKE) DISTPREFIX=man	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd src	;	\
		$(MAKE) DISTPREFIX=src	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	$(SORT) $(SPECC_HOME)/$(FILES) -o $(SPECC_HOME)/$(FILES)
	$(CHGRP) $(FILE_GROUP) $(SPECC_HOME)/$(FILES)
	$(CHMOD) $(FILE_PERM) $(SPECC_HOME)/$(FILES)
	$(TAR) czfT $(PACKAGE) $(SPECC_HOME)/$(FILES)
	$(MKDIR) $(PROJECT)
	$(TAR) xzpfC $(PACKAGE) $(PROJECT)
	$(TAR) czf $(PACKAGE) $(PROJECT)
	$(RM) -r $(PROJECT)
	$(CHGRP) $(FILE_GROUP) $(PACKAGE)
	$(CHMOD) $(FILE_PERM) $(PACKAGE)

dist2:
	-$(RM) $(FILES) $(PACKAGE2)
	for file in $(DIST); do	\
		echo $$file >>$(SPECC_HOME)/$(FILES); done
	cd bin	;	\
		$(MAKE) DISTPREFIX=bin	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd doc	;	\
		$(MAKE) DISTPREFIX=doc	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd examples;	\
		$(MAKE) DISTPREFIX=examples	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd inc	;	\
		$(MAKE) DISTPREFIX=inc	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd import;	\
		$(MAKE) DISTPREFIX=import\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd lib	;	\
		$(MAKE) DISTPREFIX=lib	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd man	;	\
		$(MAKE) DISTPREFIX=man	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	cd src	;	\
		$(MAKE) DISTPREFIX=src	\
		DISTLIST=$(SPECC_HOME)/$(FILES) dist
	for file in $(DIST2); do	\
		touch $$file;		\
		echo $$file >>$(SPECC_HOME)/$(FILES); done
	for file in $(NODIST2); do	\
		$(SED) "s*$$file**" < $(SPECC_HOME)/$(FILES)	\
			> $(SPECC_HOME)/$(FILES).tmp ;		\
		$(MV) $(SPECC_HOME)/$(FILES).tmp $(SPECC_HOME)/$(FILES) ; \
		done
	$(GREP) -v '^$$' $(SPECC_HOME)/$(FILES) > $(SPECC_HOME)/$(FILES).tmp
	$(MV) $(SPECC_HOME)/$(FILES).tmp $(SPECC_HOME)/$(FILES)
	$(MAKE) chmod
	$(SORT) $(SPECC_HOME)/$(FILES) -o $(SPECC_HOME)/$(FILES)
	$(CHGRP) $(FILE_GROUP) $(SPECC_HOME)/$(FILES)
	$(CHMOD) $(FILE_PERM) $(SPECC_HOME)/$(FILES)
	$(TAR) czhfT $(PACKAGE2) $(SPECC_HOME)/$(FILES)
	$(MKDIR) $(PROJECT)
	$(TAR) xzpfC $(PACKAGE2) $(PROJECT)
	$(TAR) czhf $(PACKAGE2) $(PROJECT)
	$(RM) -r $(PROJECT)
	$(CHGRP) $(FILE_GROUP) $(PACKAGE2)
	$(CHMOD) $(FILE_PERM) $(PACKAGE2)

dist3:		$(SPECC_HOME)/$(PACKAGE2)
	set -e;								\
	$(TAR) xvzf $(SPECC_HOME)/$(PACKAGE2) -C $(TMP);		\
	cd $(TMP)/$(PROJECT);						\
	for F in `$(FIND) . -name "*README*"`; do			\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in `$(FIND) . -name "*COPYRIGHT*"`; do			\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in `$(FIND) . -name "*INSTALL*"`; do			\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in HISTORY TODO; do					\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in `$(FIND) . -name "*.[ch]"`; do				\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in `$(FIND) . -name "*.s[ch]"`; do			\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	for F in `$(FIND) . -name "*.asc"`; do				\
		$(UNIX2DOS) $$F $$F;					\
		done;							\
	cd ..;								\
	$(CHGRP) -R $(FILE_GROUP) $(PROJECT);				\
	$(CHMOD) -R $(FILE_PERM) $(PROJECT);				\
	$(TAR) cvzf $(SPECC_HOME)/$(PACKAGE3) $(PROJECT)
	$(CHGRP) $(FILE_GROUP) $(PACKAGE3)
	$(CHMOD) $(FILE_PERM) $(PACKAGE3)
	$(RM) -r $(TMP)/$(PROJECT)

bindist:
	cd $(SPECC_INSTALL) ; $(TAR) cvzf $(SPECC)/$(BINPACK) *
	$(CHGRP) $(FILE_GROUP) $(SPECC)/$(BINPACK)
	$(CHMOD) $(FILE_PERM) $(SPECC)/$(BINPACK)

install:
	$(MKDIR) $(SPECC_INSTALL)
	$(MKDIR) $(SPECC_INSTALL)/bin
	$(MKDIR) $(SPECC_INSTALL)/inc/sys
	$(MKDIR) $(SPECC_INSTALL)/import
	$(MKDIR) $(SPECC_INSTALL)/lib
	$(MKDIR) $(SPECC_INSTALL)/man/catl
	$(MKDIR) $(SPECC_INSTALL)/man/manl
	$(MKDIR) $(SPECC_INSTALL)/examples/simple
	$(MKDIR) $(SPECC_INSTALL)/examples/sync
	$(MKDIR) $(SPECC_INSTALL)/examples/import/Adder
	$(MKDIR) $(SPECC_INSTALL)/examples/import/Gate
	$(MKDIR) $(SPECC_INSTALL)/doc
	$(CP) README.BIN $(SPECC_INSTALL)/README
	$(SED) "s*REPLACE_ME*$(SPECC_INSTALL)*"	\
		< INSTALL.BIN > $(SPECC_INSTALL)/INSTALL
	$(CP) COPYRIGHT HISTORY TODO BUGS $(SPECC_INSTALL)
	$(CP) bin/scrc$(EXE_SUFFIX) $(SPECC_INSTALL)/bin
	$(STRIP) $(SPECC_INSTALL)/bin/scrc$(EXE_SUFFIX)
	$(SED) "s*REPLACE_ME*$(SPECC_INSTALL)*"	\
		< bin/setup.csh.in > $(SPECC_INSTALL)/bin/setup.csh
	$(SED) "s*REPLACE_ME*$(SPECC_INSTALL)*"	\
		< bin/setup.sh.in > $(SPECC_INSTALL)/bin/setup.sh
	$(CP) src/longlong/longlong.h $(SPECC_INSTALL)/inc
	$(CP) src/bit/bit.h $(SPECC_INSTALL)/inc
	$(CP) src/bit/sys/bit.h $(SPECC_INSTALL)/inc/sys
	$(CP) src/sim/sim.h $(SPECC_INSTALL)/inc
	$(CP) src/sim/sim.sh $(SPECC_INSTALL)/inc
	$(CP) src/sim/specc.h $(SPECC_INSTALL)/inc
	$(CP) src/sim/piped.h $(SPECC_INSTALL)/inc
	$(CP) src/sim/signals.h $(SPECC_INSTALL)/inc
	$(CP) src/sync/c_typed_double_handshake.sh $(SPECC_INSTALL)/inc
	$(CP) src/sync/c_typed_queue.sh $(SPECC_INSTALL)/inc
	$(CP) src/sync/i_typed_receiver.sh $(SPECC_INSTALL)/inc
	$(CP) src/sync/i_typed_sender.sh $(SPECC_INSTALL)/inc
	$(CP) src/sync/i_typed_tranceiver.sh $(SPECC_INSTALL)/inc
	$(CP) src/sync/[ic]_critical_section.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/c_mutex.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/[ic]_semaphore.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/[ic]_barrier.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_producer.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_consumer.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/[ic]_token.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_sender.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_receiver.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_tranceiver.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_send.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/i_receive.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/c_queue.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/c_handshake.sc $(SPECC_INSTALL)/import
	$(CP) src/sync/c_double_handshake.sc $(SPECC_INSTALL)/import
	$(CP) lib/lib$(LLONG_LIB_NAME).$(LIBSFX) $(SPECC_INSTALL)/lib
	$(CP) lib/lib$(BIT_LIB_NAME).$(LIBSFX) $(SPECC_INSTALL)/lib
	$(CP) lib/lib$(SIM_LIB_NAME).$(LIBSFX) $(SPECC_INSTALL)/lib
	set -e;								\
	if [ "$(LIBSFX)" = "so" ]; then					\
		$(CP) lib/libGlobal.so $(SPECC_INSTALL)/lib ;		\
		$(CP) lib/libCcDriver.so $(SPECC_INSTALL)/lib ;		\
		$(CP) lib/libIntRep.so $(SPECC_INSTALL)/lib ;		\
		$(CP) lib/libParser.so $(SPECC_INSTALL)/lib ;		\
		cd $(SPECC_INSTALL)/lib ;				\
		$(RM) libGlobal.so.$(SO_SUFFIX) ;			\
		$(LINK) libGlobal.so libGlobal.so.$(SO_SUFFIX) ;	\
		$(RM) libCcDriver.so.$(SO_SUFFIX) ;			\
		$(LINK) libCcDriver.so libCcDriver.so.$(SO_SUFFIX) ;	\
		$(RM) libIntRep.so.$(SO_SUFFIX) ;			\
		$(LINK) libIntRep.so libIntRep.so.$(SO_SUFFIX) ;	\
		$(RM) libParser.so.$(SO_SUFFIX) ;			\
		$(LINK) libParser.so libParser.so.$(SO_SUFFIX) ;	\
		$(RM) lib$(LLONG_LIB_NAME).so.$(SO_SUFFIX) ;		\
		$(LINK) lib$(LLONG_LIB_NAME).so 			\
			lib$(LLONG_LIB_NAME).so.$(SO_SUFFIX) ;		\
		$(RM) lib$(BIT_LIB_NAME).so.$(SO_SUFFIX) ;		\
		$(LINK) lib$(BIT_LIB_NAME).so 				\
			lib$(BIT_LIB_NAME).so.$(SO_SUFFIX) ; 		\
		$(RM) lib$(SIM_LIB_NAME).so.$(SO_SUFFIX) ;		\
		$(LINK) lib$(SIM_LIB_NAME).so 				\
			lib$(SIM_LIB_NAME).so.$(SO_SUFFIX) ; 		\
		fi;
	$(CP) man/catl/scrc.l $(SPECC_INSTALL)/man/catl
	$(CP) man/manl/scrc.l $(SPECC_INSTALL)/man/manl
	$(CP) examples/simple/Makefile $(SPECC_INSTALL)/examples/simple
	$(CP) examples/simple/README $(SPECC_INSTALL)/examples/simple
	$(CP) examples/simple/*.sc $(SPECC_INSTALL)/examples/simple
	$(CP) examples/sync/Makefile $(SPECC_INSTALL)/examples/sync
	$(CP) examples/sync/README $(SPECC_INSTALL)/examples/sync
	$(CP) examples/sync/*.sc $(SPECC_INSTALL)/examples/sync
	$(CP) examples/import/README $(SPECC_INSTALL)/examples/import
	$(CP) examples/import/Makefile $(SPECC_INSTALL)/examples/import
	$(CP) examples/import/Adder/*.sc $(SPECC_INSTALL)/examples/import/Adder
	$(CP) examples/import/Gate/*.sc $(SPECC_INSTALL)/examples/import/Gate
	$(CP) examples/import/Testbench.sc $(SPECC_INSTALL)/examples/import
	$(CP) doc/SpecC_LRM.pdf $(SPECC_INSTALL)/doc
	-$(CHGRP) -R $(INSTALL_GROUP) $(SPECC_INSTALL)
	-$(CHMOD) -R $(INSTALL_PERM) $(SPECC_INSTALL)

uninstall:
	$(RM) $(SPECC_INSTALL)/README
	$(RM) $(SPECC_INSTALL)/INSTALL
	$(RM) $(SPECC_INSTALL)/COPYRIGHT
	$(RM) $(SPECC_INSTALL)/HISTORY
	$(RM) $(SPECC_INSTALL)/TODO
	$(RM) $(SPECC_INSTALL)/BUGS
	$(RM) $(SPECC_INSTALL)/bin/scrc$(EXE_SUFFIX)
	$(RM) $(SPECC_INSTALL)/bin/setup.csh
	$(RM) $(SPECC_INSTALL)/bin/setup.sh
	-$(RMDIR) $(SPECC_INSTALL)/bin
	$(RM) $(SPECC_INSTALL)/inc/longlong.h
	$(RM) $(SPECC_INSTALL)/inc/bit.h
	$(RM) $(SPECC_INSTALL)/inc/sys/bit.h
	-$(RMDIR) $(SPECC_INSTALL)/inc/sys
	$(RM) $(SPECC_INSTALL)/inc/sim.h
	$(RM) $(SPECC_INSTALL)/inc/sim.sh
	$(RM) $(SPECC_INSTALL)/inc/specc.h
	$(RM) $(SPECC_INSTALL)/inc/piped.h
	$(RM) $(SPECC_INSTALL)/inc/signals.h
	$(RM) $(SPECC_INSTALL)/inc/c_typed_double_handshake.sh
	$(RM) $(SPECC_INSTALL)/inc/c_typed_queue.sh
	$(RM) $(SPECC_INSTALL)/inc/i_typed_receiver.sh
	$(RM) $(SPECC_INSTALL)/inc/i_typed_sender.sh
	$(RM) $(SPECC_INSTALL)/inc/i_typed_tranceiver.sh
	-$(RMDIR) $(SPECC_INSTALL)/inc
	$(RM) $(SPECC_INSTALL)/import/[ic]_critical_section.sc
	$(RM) $(SPECC_INSTALL)/import/c_mutex.sc
	$(RM) $(SPECC_INSTALL)/import/[ic]_semaphore.sc
	$(RM) $(SPECC_INSTALL)/import/[ic]_barrier.sc
	$(RM) $(SPECC_INSTALL)/import/i_producer.sc
	$(RM) $(SPECC_INSTALL)/import/i_consumer.sc
	$(RM) $(SPECC_INSTALL)/import/[ic]_token.sc
	$(RM) $(SPECC_INSTALL)/import/i_sender.sc
	$(RM) $(SPECC_INSTALL)/import/i_receiver.sc
	$(RM) $(SPECC_INSTALL)/import/i_tranceiver.sc
	$(RM) $(SPECC_INSTALL)/import/i_send.sc
	$(RM) $(SPECC_INSTALL)/import/i_receive.sc
	$(RM) $(SPECC_INSTALL)/import/c_queue.sc
	$(RM) $(SPECC_INSTALL)/import/c_handshake.sc
	$(RM) $(SPECC_INSTALL)/import/c_double_handshake.sc
	-$(RMDIR) $(SPECC_INSTALL)/import
	$(RM) $(SPECC_INSTALL)/lib/lib$(LLONG_LIB_NAME).$(LIBSFX)
	$(RM) $(SPECC_INSTALL)/lib/lib$(BIT_LIB_NAME).$(LIBSFX)
	$(RM) $(SPECC_INSTALL)/lib/lib$(SIM_LIB_NAME).$(LIBSFX)
	$(RM) $(SPECC_INSTALL)/lib/libqthread.$(LIBSFX)
	$(RM) $(SPECC_INSTALL)/lib/libGlobal.so
	$(RM) $(SPECC_INSTALL)/lib/libCcDriver.so
	$(RM) $(SPECC_INSTALL)/lib/libIntRep.so
	$(RM) $(SPECC_INSTALL)/lib/libParser.so
	$(RM) $(SPECC_INSTALL)/lib/libGlobal.so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/libCcDriver.so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/libIntRep.so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/libParser.so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/lib$(LLONG_LIB_NAME).so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/lib$(BIT_LIB_NAME).so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/lib$(SIM_LIB_NAME).so.$(SO_SUFFIX)
	$(RM) $(SPECC_INSTALL)/lib/libqthread.so.$(SO_SUFFIX)
	-$(RMDIR) $(SPECC_INSTALL)/lib
	$(RM) $(SPECC_INSTALL)/man/catl/scrc.l
	-$(RMDIR) $(SPECC_INSTALL)/man/catl
	$(RM) $(SPECC_INSTALL)/man/manl/scrc.l
	-$(RMDIR) $(SPECC_INSTALL)/man/manl
	-$(RMDIR) $(SPECC_INSTALL)/man
	$(RM) -rf $(SPECC_INSTALL)/examples/simple
	$(RM) -rf $(SPECC_INSTALL)/examples/sync
	$(RM) -rf $(SPECC_INSTALL)/examples/import
	-$(RMDIR) $(SPECC_INSTALL)/examples
	$(RM) -rf $(SPECC_INSTALL)/doc/SpecC_LRM.pdf
	-$(RMDIR) $(SPECC_INSTALL)/doc
	-$(RMDIR) $(SPECC_INSTALL)

orig:
	-$(RM) $(ORIGINALS)
	for file in $(ORIG); do echo $$file >>$(SPECC_HOME)/$(ORIGINALS); done
	cd bin	;	\
		$(MAKE) ORIGPREFIX=bin	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd doc	;	\
		$(MAKE) ORIGPREFIX=doc	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd examples;	\
		$(MAKE) ORIGPREFIX=examples	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd inc	;	\
		$(MAKE) ORIGPREFIX=inc	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd import;	\
		$(MAKE) ORIGPREFIX=import	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd lib	;	\
		$(MAKE) ORIGPREFIX=lib	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd man	;	\
		$(MAKE) ORIGPREFIX=man	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	cd src	;	\
		$(MAKE) ORIGPREFIX=src	\
		ORIGLIST=$(SPECC_HOME)/$(ORIGINALS) orig
	$(SORT) $(SPECC_HOME)/$(ORIGINALS) -o $(SPECC_HOME)/$(ORIGINALS)
	$(CHGRP) $(FILE_GROUP) $(SPECC_HOME)/$(ORIGINALS)
	$(CHMOD) $(FILE_PERM) $(SPECC_HOME)/$(ORIGINALS)

wc:	orig
	wc `cat $(ORIGINALS)`

test:
	cd src ;							\
	LD_LIBRARY_PATH=$(SPECC_LIB)$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
		$(MAKE) test
	@echo "***"
	@echo "*** All tests successfully completed."
	@echo "***"

puretest:
	cd src ;							\
	LD_LIBRARY_PATH=$(SPECC_LIB)$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
		$(MAKE) puretest
	@echo "***"
	@echo "*** All tests successfully (and purely!) completed."
	@echo "***"

testall:
	cd src ;							\
	LD_LIBRARY_PATH=$(SPECC_LIB)$${LD_LIBRARY_PATH:+:}$${LD_LIBRARY_PATH} \
		$(MAKE) test
	cd examples ;							\
		$(MAKE) test
	@echo "***"
	@echo "*** All tests (including examples) successfully completed."
	@echo "***"

todo:	orig
	$(GREP) -n "\.\.\.\." `cat $(ORIGINALS)` >$(TMP)/todo
	wc -l $(TMP)/todo ; xless $(TMP)/todo ; $(RM) $(TMP)/todo &


base:
	cd inc		; $(MAKE) all
	cd lib		; $(MAKE) all
	cd bin		; $(MAKE) all
	cd man		; $(MAKE) all
	cd doc		; $(MAKE) all
	cd examples	; $(MAKE) all

scrc:
	cd src			; $(MAKE) scrc

scrctest:
	cd src/Global		; $(MAKE) test
	cd src/CcDriver		; $(MAKE) test
	cd src/IntRep		; $(MAKE) test
	cd src/Parser		; $(MAKE) test
	cd src/Compiler		; $(MAKE) scrctest
	@echo "***"
	@echo "*** Compiler tests successfully completed."
	@echo "***"

libsim:
	cd src			; $(MAKE) libsim

libbit:
	cd src			; $(MAKE) libbit

liblonglong:
	cd src			; $(MAKE) liblonglong

libtest:
	cd src/longlong 	; $(MAKE) test
	cd src/bit		; $(MAKE) test
	cd src/sim		; $(MAKE) test
	@echo "***"
	@echo "*** Library tests successfully completed."
	@echo "***"

slinks:
	for file in $(SYMLINKS_CMP); do					\
		$(RM) $(SLINK_CMP_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_CMP_BASE)/`basename $$file`;	\
	done
	`$(MKDIR) $(SLINK_CMP_BASE)/examples`
	for file in $(SYMLINKS_CMP_EX); do				\
		$(RM) $(SLINK_CMP_BASE)/examples/`basename $$file`;	\
		$(LINK) $$file $(SLINK_CMP_BASE)/examples/`basename $$file`;\
	done
	for file in $(SYMLINKS_IMP); do					\
		$(RM) $(SLINK_TOP_IMP_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_TOP_IMP_BASE)/`basename $$file`;	\
	done
	for file in $(SYMLINKS_INC); do					\
		$(RM) $(SLINK_INC_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_INC_BASE)/`basename $$file`;	\
	done
	for file in $(SYMLINKS_LIB); do					\
		$(RM) $(SLINK_LIB_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_LIB_BASE)/`basename $$file`;	\
	done
	for file in $(SYMLINKS_BIN); do					\
		$(RM) $(SLINK_BIN_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_BIN_BASE)/`basename $$file`;	\
	done
	`$(MKDIR) $(SLINK_MANL_BASE)`
	for file in $(SYMLINKS_MAN); do					\
		$(RM) $(SLINK_MANL_BASE)/`basename $$file`;		\
		$(LINK) $$file $(SLINK_MANL_BASE)/`basename $$file`;	\
	done
	`$(MKDIR) $(SLINK_INC_BASE)/sys`
	for file in $(SYMLINKS_INCSYS); do				\
		$(RM) $(SLINK_INC_BASE)/sys/`basename $$file`;		\
		$(LINK) $$file $(SLINK_INC_BASE)/sys/`basename $$file`;	\
	done
	file=$(SYMLINKS_PURIFY);					\
	$(RM) $(SLINK_PRS_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_SIM_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_LL_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_BIT_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_INTRP_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_GLB_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_CCD_BASE)/`basename $$file`;			\
	$(RM) $(SLINK_CMP_BASE)/`basename $$file`;			\
	$(LINK) $$file $(SLINK_PRS_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_SIM_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_LL_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_BIT_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_INTRP_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_GLB_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_CCD_BASE)/`basename $$file`;		\
	$(LINK) $$file $(SLINK_CMP_BASE)/`basename $$file`;


# --- EOF Makefile ---
