# -----------------------------------------------------------------------------
# Makefile: for long long library
# -----------------------------------------------------------------------------
#
# Modifications: (most recent first)
#
# RD 07/10/12	this implementation is not safe for strict aliasing
#		optimization available with GCC 4.x; in compiler calls,
#		added -fno-strict-aliasing to avoid problems and warnings
# RD 01/05/06	added CCOPT1 to avoid warning about unused opt. impl.-templ.
# AG 03/21/05	added missing sizing.h dependency for limits.sh generation
# AG 10/09/04	added sizing.cc for size checks
# 06/15/04 PC   Adjustments for scrc 2.0
# RD 10/03/02	separated 'clean' target into 'clean' and 'distclean'
# AG 05/01/01	copy of non-existing links to headers
# AG 04/05/01	initial version
# ------------------------------------------------------------------------

# --- macros

include ../../Makefile.macros

MODULE	=	longlong
BINARY	=	longlong_debug
BINFILE =	$(BINARY)$(EXE_SUFFIX)
BINPURE =	$(BINARY)_pure
PUREFILE=	$(BINPURE)$(EXE_SUFFIX)
PREFIX	=	LONGLONG_
LIBRARY	=	lib$(MODULE)
LIBOBJ	=	$(MODULE).o
OBJECTS =
LIBDEP	=
LIBS	=
INCLUDE	=	$(MODULE).h sizing.h
EXAMPLE	=
DIST	=	$(MODULE).cc $(MODULE).in.h Makefile .purify \
		limits.in.sh sizing.cc $(EXAMPLE)
ORIG	=	$(MODULE).cc $(MODULE).in.h Makefile \
		limits.in.sh sizing.cc $(EXAMPLE)

# omit option -fno-implicit-templates in CCOPT
CCOPT1	=	$(OPTIM) $(CCSPCL) $(DYNLIB) $(KANJI) $(LLONG) $(TMETHOD) $(ARYASN)


# --- compilation rules

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

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

$(LIBRARY).so:	$(LIBRARY).a
	$(LNSO) -o $(LIBRARY).so $(LIBOBJ)
	$(CHMOD) $(FILE_PERM) $(LIBRARY).so

$(MODULE).o:	$(MODULE).cc $(INCLUDE)
	$(CC) $(MODULE).cc -fno-strict-aliasing
	$(CHMOD) $(FILE_PERM) $(MODULE).o

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

$(MODULE).h:	$(MODULE).in.h sizing.h
	$(CPP) -C -P -DFIRST_PASS $(CCOPT) $(MODULE).in.h | 		\
		$(SED) "s|^_CPP_|#|" > $(MODULE).h

limits.sh:	limits.in.sh sizing.h
	$(CPP) -C -P $(CCOPT1) -x c-header limits.in.sh |		\
		$(SED) "s|^_CPP_|#|" > limits.sh
		
sizing.o:	sizing.cc
	$(CC) sizing.cc

sizing$(EXE_SUFFIX):	sizing.o
	$(LN) -o sizing$(EXE_SUFFIX) sizing.o $(STDLIB)

sizing.h:	sizing$(EXE_SUFFIX)
	./sizing$(EXE_SUFFIX) >sizing.h

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

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

$(SPECC_LIB)/$(LIBRARY).so:	$(SPECC_SRC)/longlong/$(LIBRARY).so $(SPECC_LIB)/$(LIBRARY).a
	$(CP) $(SPECC_SRC)/longlong/$(LIBRARY).so $(SPECC_LIB)

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

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

$(SPECC_INC)/limits.sh:		$(SPECC_SRC)/longlong/limits.sh
	$(CP) $(SPECC_SRC)/longlong/limits.sh $(SPECC_INC)

# --- service rules

clean:
	-$(RM) *.bak *.BAK *~
	-$(RM) *.o core
	-$(RM) *.pure* *_pure* .pure

distclean:	clean
	-$(RM) limits.sh sizing$(EXE_SUFFIX) $(BINFILE) $(INCLUDE) $(LIBRARY).*


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

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

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

test:		$(BINFILE) $(EXAMPLE)
	./$(BINARY)

mytest:		$(BINFILE) $(EXAMPLE)
	./$(BINARY)
	
pure:		$(PUREFILE)

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


# --- EOF Makefile ---
