# ------------------------------------------------------------------------
# Makefile: top-level Makefile for the SpecC Reference Compiler
# ------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# 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'
# AG 08/08/01	renamed PROJECT to 'scc'
# 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		\
		inc/sim.h		\
		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


# --- rules

all:
	cd man		; $(MAKE) dirs
	cd inc		; $(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) dist
	$(MAKE) dist2
	$(MAKE) dist3
	$(MAKE) all
	$(MAKE) bindist
	$(MAKE) testall
	$(MAKE) wc
	$(MAKE) chmod

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

clean:
	-$(RM) core *.bak *.BAK *~
	cd inc		; $(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

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

uninstall:
	-$(RM) -r $(SPECC_INSTALL)

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 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 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) > $(TMP)/$(FILES) ;	\
		$(GREP) -v '^$$' $(TMP)/$(FILES) > $(SPECC_HOME)/$(FILES) ; \
		done
	$(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)

install:	bin_install

bin_install:
	-$(RM) -r $(SPECC_INSTALL)
	$(MKDIR) $(SPECC_INSTALL)/bin
	$(MKDIR) $(SPECC_INSTALL)/inc/sys
	$(MKDIR) $(SPECC_INSTALL)/lib
	$(MKDIR) $(SPECC_INSTALL)/man/catl
	$(MKDIR) $(SPECC_INSTALL)/man/manl
	$(MKDIR) $(SPECC_INSTALL)/examples/simple
	$(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) 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 ;				\
		$(LINK) libGlobal.so libGlobal.so.$(SO_SUFFIX) ;	\
		$(LINK) libCcDriver.so libCcDriver.so.$(SO_SUFFIX) ;	\
		$(LINK) libIntRep.so libIntRep.so.$(SO_SUFFIX) ;	\
		$(LINK) libParser.so libParser.so.$(SO_SUFFIX) ;	\
		$(LINK) lib$(LLONG_LIB_NAME).so 			\
			lib$(LLONG_LIB_NAME).so.$(SO_SUFFIX) ;		\
		$(LINK) lib$(BIT_LIB_NAME).so 				\
			lib$(BIT_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/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.ps $(SPECC_INSTALL)/doc
	-$(CHGRP) -R $(INSTALL_GROUP) $(SPECC_INSTALL)
	-$(CHMOD) -R $(INSTALL_PERM) $(SPECC_INSTALL)

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

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


# --- EOF Makefile ---
