# -----------------------------------------------------------------------------
# Makefile: for bit vector library
# -----------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# RD 10/03/02	separated 'clean' target into 'clean' and 'distclean'
# RD 09/10/02	added -fno-inline to compile bit_debug (avoid GCC crash)
# RD 12/10/01	sys/bit.h must not include <string.h> on CygWin platform
# AG 11/28/01 	Removed special longlong handling
# AG 11/17/01	added vptr definition patch of include files from GL_System.h
# AG 05/01/01	copy of non-existing links to headers, //!LLONG! support
# RD 04/23/01	fix for allowing spaces in $(LLONG) definition
# AG 04/19/01	added support for non-native long long
# 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 06/18/00	eliminated Makefile.macros (symb. link) in $SPECC/src
# AG 02/09/00	added mytest, fixed copy library targets to allow local builds
# RD 03/28/99	added support for shared libraries
# AG 03/23/99   Added regression tests in subdirectory ./tst
# AG 06/02/98	Added support for WIN32
# AG 05/07/98	initial version (copy from CcDriver Makefile)
# ------------------------------------------------------------------------

# --- 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 -fno-inline \
		-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|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 '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
	VPTR=`$(GREP) GL_SYSTEM_VPTR_IS $(SPECC_INC)/GL_System.h` ;	\
	if [ "$(TARGET)" = "GNUWIN32" ]; then				\
		STRINGH='extern "C" unsigned int strlen(const char *);';\
	else								\
		STRINGH='#include <string.h>' ;				\
	fi ;								\
	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|ll2int\(([^;]*)\)|\1.toInt()|g'		\
		       -e 's|ll2uint\(([^;]*)\)|\1.toUInt()|g'		\
		       -e "s|#include <GL_System.h>|$$VPTR|g"		\
		       -e "s|#include <string.h>|$$STRINGH|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 's|ll2int\(([^;]*)\)|(int)\1|g'		\
		       -e 's|ll2uint\(([^;]*)\)|(unsigned int)\1|g'	\
		       -e "s|#include <GL_System.h>|$$VPTR|g"		\
		       -e "s|#include <string.h>|$$STRINGH|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 core
	-$(RM) *.pure* *_pure* .pure
	-$(RM) sys/*~
	cd tst ; $(MAKE) clean

distclean:	clean
	-$(RM) $(INCLUDE) $(BINFILE) $(LIBRARY).*


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