# -----------------------------------------------------------------------------
# Makefile: for bit vector library
# -----------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# AG 05/24/01	Initial version
# -----------------------------------------------------------------------------

# --- macros

include ../../Makefile.macros

MODULE	=	bit
BINARY	=	bit_debug
BINFILE =	$(BINARY)$(EXE_SUFFIX)
BINPURE =	$(BINARY)_pure
PUREFILE=	$(BINPURE)$(EXE_SUFFIX)
PREFIX	=	BIT_
LIBRARY	=	lib$(MODULE)
LIBOBJ	=	$(MODULE).o
OBJECTS =
LIBDEP	=
LIBS	=	-l$(LLONG_LIB_NAME)
INCLUDE	=	$(MODULE).h sys/$(MODULE).h
EXAMPLE	=
DIST	=	$(MODULE).cc $(MODULE).in.h sys/$(MODULE).in.h \
		Makefile .purify $(EXAMPLE)
ORIG	=	$(MODULE).cc $(MODULE).in.h sys/$(MODULE).in.h \
		Makefile $(EXAMPLE)


# --- compilation rules

all:		$(LIBRARY).$(LIBSFX) $(SPECC_LIB)/$(LIBRARY).$(LIBSFX) \
		$(SPECC_INC)/$(MODULE).h $(SPECC_INC)/sys/$(MODULE).h

$(BINFILE):	$(BINARY).o $(OBJECTS) $(LIBDEP)
	$(LN) -o $(BINARY) $(BINARY).o $(OBJECTS) $(LIBS) $(STDLIB)
	$(CHMOD) $(FILE_PERM) $(BINFILE)

$(PUREFILE):	$(BINARY).o $(OBJECTS) $(LIBDEP)
	$(LNPURE) -o $(BINPURE) $(BINARY).o $(OBJECTS) $(LIBS) $(STDLIB)
	$(CHMOD) $(FILE_PERM) $(PUREFILE)

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

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

$(MODULE).o:	$(MODULE).cc $(INCLUDE)
	$(CC) $(MODULE).cc
	$(CHMOD) $(FILE_PERM) $(MODULE).o

$(BINARY).o:	$(MODULE).cc $(INCLUDE)
	$(CC) $(DEBUG) -fimplicit-templates -o $(BINARY).o $(MODULE).cc
	$(CHMOD) $(FILE_PERM) $(BINARY).o

$(MODULE).h:	$(MODULE).in.h
	if echo "$(LLONG)" | $(GREP) -v "HAVE_LLONG" >/dev/null ; then	\
		$(SED) -e 's|UNSIGNED_LONG_LONG|_longlong<true>|g'	\
		       -e 's|LONG_LONG|_longlong<>|g'			\
		       -e 's|^//!LLONG!||g'				\
		       -e 's|ll2int\(([^;]*)\)|\1.toInt()|g'		\
		       -e 's|ll2uint\(([^;]*)\)|\1.toUInt()|g'		\
			< $(MODULE).in.h > $(MODULE).h;			\
	else								\
		$(SED) -e 's|UNSIGNED_LONG_LONG|unsigned long long|g'	\
		       -e 's|LONG_LONG|long long|g'			\
		       -e '/^\/\/!LLONG!/ d'				\
		       -e 's|ll2int\(([^;]*)\)|(int)\1|g'		\
		       -e 's|ll2uint\(([^;]*)\)|(unsigned int)\1|g'	\
			< $(MODULE).in.h > $(MODULE).h;			\
	fi

sys/$(MODULE).h: sys/$(MODULE).in.h
	if echo "$(LLONG)" | $(GREP) -v "HAVE_LLONG" >/dev/null ; then	\
		$(SED) -e 's|UNSIGNED_LONG_LONG|_longlong<true>|g'	\
		       -e 's|LONG_LONG|_longlong<>|g'			\
		       -e 's|^//!LLONG!||g'				\
		       -e 's|ll2int\(([^;]*)\)|\1.toInt()|g'		\
		       -e 's|ll2uint\(([^;]*)\)|\1.toUInt()|g'		\
			< sys/$(MODULE).in.h > sys/$(MODULE).h;		\
	else								\
		$(SED) -e 's|UNSIGNED_LONG_LONG|unsigned long long|g'	\
		       -e 's|LONG_LONG|long long|g'			\
		       -e '/^\/\/!LLONG!/ d'				\
		       -e 's|ll2int\(([^;]*)\)|(int)\1|g'		\
		       -e 's|ll2uint\(([^;]*)\)|(unsigned int)\1|g'	\
			< sys/$(MODULE).in.h > sys/$(MODULE).h;		\
	fi


# --- copy library if no symbolic link (on WIN32)

$(SPECC_LIB)/$(LIBRARY).a:	$(SPECC_SRC)/bit/$(LIBRARY).a
	$(CP) $(SPECC_SRC)/bit/$(LIBRARY).a $(SPECC_LIB)

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

# --- copy header files if no symbolic link (on WIN32)

$(SPECC_INC)/$(MODULE).h:	$(SPECC_SRC)/bit/$(MODULE).h
	$(CP) $(SPECC_SRC)/bit/$(MODULE).h $(SPECC_INC)

$(SPECC_INC)/sys/$(MODULE).h:	$(SPECC_SRC)/bit/sys/$(MODULE).h
	$(CP) $(SPECC_SRC)/bit/sys/$(MODULE).h $(SPECC_INC)/sys

# --- service rules

clean:
	-$(RM) *.bak *.BAK *~
	-$(RM) *.o $(INCLUDE) $(BINFILE) $(LIBRARY).* core
	-$(RM) *.pure* *_pure* .pure
	-$(RM) sys/*~
	cd tst ; $(MAKE) clean

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

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

orig:
	for file in $(ORIG); do echo $(ORIGPREFIX)/$$file >>$(ORIGLIST); done
	cd tst ; $(MAKE) ORIGPREFIX=$(ORIGPREFIX)/tst DISTLIST=$(ORIGLIST) orig

test:		$(BINFILE) $(EXAMPLE)
	./$(BINARY)
	cd tst ; $(MAKE) test

mytest:		$(BINFILE) $(EXAMPLE)
	./$(BINARY)
	cd tst ; $(MAKE) mytest
	
pure:		$(PUREFILE)

puretest:	$(PUREFILE) $(EXAMPLE)
	./$(BINPURE)


# --- EOF Makefile ---
