# Makefile for C++ interface of QDBM



#================================================================
# Setting Variables
#================================================================


# Generic settings
SHELL = @SHELL@
srcdir = @srcdir@
VPATH = @srcdir@

# Packaging
PACKAGE = qdbm

# Targets
MYHEADS = xqdbm.h xadbm.h xdepot.h xcuria.h xvilla.h
MYLIBOBJS =  xqdbm.o xadbm.o xdepot.o xcuria.o xvilla.o
MYLIBS = libxqdbm.a #libxqdbm.so.1.0.0 libxqdbm.so.1 libxqdbm.so
MYBINS = xdptest xcrtest xvltest
MYDOCS = xspex.html xspex-ja.html xapidoc

# Install destinations
prefix = @prefix@
exec_prefix = @exec_prefix@
MYHEADDIR = @includedir@
MYLIBDIR = @libdir@
MYBINDIR = @bindir@
MYSHAREDIR = $(prefix)/share/$(PACKAGE)/plus
DESTDIR =

# Building binaries
CXX = g++
RELCXXFLAGS = -O1 -DNDEBUG
CPPFLAGS = -I$(srcdir) -I$(srcdir)/.. -I/usr/local/include \
  -D_GNU_SOURCE -D__EXTENSIONS__ -D_POSIX_C_SOURCE=200112 -DPIC -D_REENTRANT
CXXFLAGS = -Wall -ansi -pedantic -fsigned-char -fexceptions -fPIC $(RELCXXFLAGS)
LD = @LD@
LIBS = -lqdbm @LIBS@
LIBLDFLAGS = -L. -L$(srcdir)/.. -L/usr/local/lib $(LIBS)
LDFLAGS = -L. -L$(srcdir)/.. -L/usr/local/lib -lxqdbm $(LIBS)
LDENV = LD_RUN_PATH=/lib:/usr/lib:$(MYLIBDIR)
AR = @AR@
ARFLAGS = rcsv
RUNENV = LD_LIBRARY_PATH=.:..:/usr/local/lib



#================================================================
# Suffix rules
#================================================================


.SUFFIXES :
.SUFFIXES : .cc .o

.cc.o :
	$(CXX) $(CPPFLAGS) $(CXXFLAGS) -c $<



#================================================================
# Actions
#================================================================


targets : @TARGETS@


all : $(MYLIBS) $(MYBINS)
	@printf '\n'
	@printf '#================================================================\n'
	@printf '# Ready to install.\n'
	@printf '#================================================================\n'


static :
	make LDFLAGS="-static $(LDFLAGS)" all


debug :
	make RELCXXFLAGS="-g" LDFLAGS="-static $(LDFLAGS)" all


devel :
	make RELCXXFLAGS="-g -O2 -pipe" all
	sync ; sync



profile :
	make RELCXXFLAGS="-pg -g -O2 -Werror -DNDEBUG" LDFLAGS="-static $(LDFLAGS)" all


clean :
	rm -rf $(MYLIBS) $(MYBINS) *.o \
	  *.exe *.dll.a *.dll *.dylib *.sl a.out TAGS gmon.out leak.log casket *~


install :
	mkdir -p $(DESTDIR)$(MYHEADDIR)
	cd $(srcdir) && cp -Rf $(MYHEADS) $(DESTDIR)$(MYHEADDIR)
	mkdir -p $(DESTDIR)$(MYLIBDIR)
	cp -Rf $(MYLIBS) $(DESTDIR)$(MYLIBDIR)
	mkdir -p $(DESTDIR)$(MYBINDIR)
	cp -Rf $(MYBINS) $(DESTDIR)$(MYBINDIR)
	mkdir -p $(DESTDIR)$(MYSHAREDIR)
	cp -Rf $(MYDOCS) $(DESTDIR)$(MYSHAREDIR)
	@printf '\n'
	@printf '#================================================================\n'
	@printf '# Thanks for using QDBM for C++.\n'
	@printf '#================================================================\n'


install-strip :
	make DESTDIR=$(DESTDIR) install
	cd $(DESTDIR)$(MYBINDIR) && strip $(MYBINS)


uninstall :
	cd $(DESTDIR)$(MYHEADDIR) && rm -f $(MYHEADS)
	cd $(DESTDIR)$(MYLIBDIR) && rm -f $(MYLIBS)
	cd $(DESTDIR)$(MYBINDIR) && rm -f $(MYBINS)
	rm -rf $(DESTDIR)$(MYSHAREDIR)


dist :
	autoconf
	make doc
	make distclean


distclean : clean
	rm -rf Makefile config.cache config.log config.status autom4te.cache


TAGS :
	etags -o $@ *.c *.h


check :
	sync ; sync
	rm -rf casket*
	$(RUNENV) ./xdptest write casket 50000 5000
	$(RUNENV) ./xdptest read casket
	$(RUNENV) ./xdptest multi casket 10000 1000 10
	$(RUNENV) ./xdptest misc casket
	rm -rf casket*
	$(RUNENV) ./xcrtest write casket 50000 5000 10
	$(RUNENV) ./xcrtest read casket
	$(RUNENV) ./xcrtest multi casket 10000 1000 10 10
	$(RUNENV) ./xcrtest misc casket
	rm -rf casket*
	$(RUNENV) ./xcrtest write -lob casket 500 50 10
	$(RUNENV) ./xcrtest read -lob casket
	$(RUNENV) ./xcrtest multi -lob casket 500 50 10 10
	rm -rf casket*
	$(RUNENV) ./xvltest write casket 50000
	$(RUNENV) ./xvltest read casket
	$(RUNENV) ./xvltest multi casket 10000 10
	$(RUNENV) ./xvltest misc casket
	rm -rf casket*
	@printf '\n'
	@printf '#================================================================\n'
	@printf '# Checking completed.\n'
	@printf '#================================================================\n'


doc :
	make docclean
	mkdir -p xapidoc
	doxygen


docclean :
	rm -rf xapidoc


win :
	make MYLIBS="libxqdbm.dll.a" \
	  CXXFLAGS="-Wall -ansi -pedantic -fsigned-char -fexceptions -O1 -DNDEBUG"


check-win :
	make check


install-win :
	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
	  MYLIBS="libxqdbm.dll.a" install
	cp -Rf xqdbm.dll "`printf '%s' $$SYSTEMROOT | tr '\\\\' '/'`/SYSTEM32"


uninstall-win :
	make MYBINS="`for file in $(MYBINS) ; do echo $$file.exe ; done | tr '\n' ' '`" \
	  MYLIBS="libxqdbm.dll.a" uninstall
	rm -f "`printf '%s' $$SYSTEMROOT | tr '\\\\' '/'`/SYSTEM32/xqdbm.dll"


mac :
	make MYLIBS="libxqdbm.a libxqdbm.1.0.0.dylib libxqdbm.1.dylib libxqdbm.dylib" \
	  CXXFLAGS="-Wall -fsigned-char -fexceptions -fno-common -O2 -DNDEBUG"


check-mac :
	make RUNENV="DYLD_LIBRARY_PATH=.:..:/usr/local/lib" check


install-mac :
	make MYLIBS="libxqdbm.a libxqdbm.1.0.0.dylib libxqdbm.1.dylib libxqdbm.dylib" install


uninstall-mac :
	make MYLIBS="libxqdbm.a libxqdbm.1.0.0.dylib libxqdbm.1.dylib libxqdbm.dylib" uninstall


hpux :
	make MYLIBS="libxqdbm.a libxqdbm.sl"


check-hpux :
	make RUNENV="SHLIB_PATH=.:..:/usr/local/lib" check


install-hpux :
	make MYLIBS="libxqdbm.a libxqdbm.sl" install


uninstall-hpux :
	make MYLIBS="libxqdbm.a libxqdbm.sl" uninstall


.PHONY : all clean install check



#================================================================
# Building binaries
#================================================================


libxqdbm.a : $(MYLIBOBJS)
	$(AR) $(ARFLAGS) $@ $(MYLIBOBJS)


libxqdbm.so.1.0.0 : $(MYLIBOBJS)
	if $(LD) -V | grep "GNU" > /dev/null ; \
	  then \
	    $(LD) -shared -soname libxqdbm.so.1 -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
	  else \
	    $(LD) -G -h libxqdbm.so.1 -o $@ $(MYLIBOBJS) $(LIBLDFLAGS) ; \
	  fi


libxqdbm.so.1 : libxqdbm.so.1.0.0
	ln -f -s libxqdbm.so.1.0.0 $@


libxqdbm.so : libxqdbm.so.1.0.0
	ln -f -s libxqdbm.so.1.0.0 $@


libxqdbm.dll.a : xqdbm.dll


xqdbm.dll : $(MYLIBOBJS)
	$(CXX) -shared -o $@ \
	  -Wl,--out-implib=lib$@.a \
	  -Wl,--export-all-symbols \
	  -Wl,--enable-auto-import \
	  -Wl,--add-stdcall-alias \
	  -Wl,--whole-archive $(MYLIBOBJS) \
	  -Wl,--no-whole-archive $(LIBLDFLAGS)


libxqdbm.1.0.0.dylib : $(MYLIBOBJS)
	$(CXX) -dynamiclib -o $@ \
	  -install_name libxqdbm.1.dylib \
	  -current_version 1.0.0 \
	  -compatibility_version 1.0 \
	  $(MYLIBOBJS) $(LIBLDFLAGS)


libxqdbm.1.dylib : libxqdbm.1.0.0.dylib
	ln -f -s libxqdbm.1.0.0.dylib $@


libxqdbm.dylib : libxqdbm.1.0.0.dylib
	ln -f -s libxqdbm.1.0.0.dylib $@


libxqdbm.sl : $(MYLIBOBJS)
	$(LD) -b -o $@ $(MYLIBOBJS) $(LIBLDFLAGS)


xdptest : xdptest.o $(MYLIBS)
	$(LDENV) $(CXX) $(CXXFLAGS) -o $@ xdptest.o $(LDFLAGS)


xcrtest : xcrtest.o $(MYLIBS)
	$(LDENV) $(CXX) $(CXXFLAGS) -o $@ xcrtest.o $(LDFLAGS)


xvltest : xvltest.o $(MYLIBS)
	$(LDENV) $(CXX) $(CXXFLAGS) -o $@ xvltest.o $(LDFLAGS)


xadbm.o : xqdbm.h xadbm.h

xdepot.o xdptest.o : xqdbm.h xadbm.h xdepot.h

xcuria.o xcrtest.o : xqdbm.h xadbm.h xcuria.h

xvilla.o xvltest.o : xqdbm.h xadbm.h xvilla.h



# END OF FILE