Revision 238 (by dpavlin, 2004/03/08 17:46:16) tagging openisis 0.9.0
#
#/*
#	openisis - an open implementation of the CDS/ISIS database
#	Version 0.8.x (patchlevel see file Version)
#	Copyright (C) 2001-2003 by Erik Grziwotz, erik@openisis.org
#
#	This library is free software; you can redistribute it and/or
#	modify it under the terms of the GNU Lesser General Public
#	License as published by the Free Software Foundation; either
#	version 2.1 of the License, or (at your option) any later version.
#
#	This library is distributed in the hope that it will be useful,
#	but WITHOUT ANY WARRANTY; without even the implied warranty of
#	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
#	Lesser General Public License for more details.
#
#	You should have received a copy of the GNU Lesser General Public
#	License along with this library; if not, write to the Free Software
#	Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
#
#	see README for more information
#EOH */
#
#
#	$Id: Makefile,v 1.92 2003/06/30 09:59:35 kripke Exp $
#	the Makefile
#

TARGETS=$(BINARY) ois

# some require explicit ST or MT build, other targets work with both
# O switchable directory for binaries; one of
#	sto for single threaded unix (used by Perl, PHP, Tcl)
#	mto for multi threaded unix (used by Java, Tcl)
# win for gates of hell (used by general failure)
#
# sto or win
STO=sto
# sto, mto or win
O=sto

MTFLAGS=
MTLIBS=
ifneq ($(WIN32),)
	STO=win
	O=win
	# don't support MT on windows -- Java or PHP must connect server
	MTFLAGS=
	EXE=.exe
else
ifneq ($(MT),)
	O=mto
	MTFLAGS=-D_REENTRANT
	MTLIBS=-lpthread
endif
endif

BINARY=$(O)/openisis$(EXE)
JTARGETS=openisis.jar mto/libopenjsis.so
# object files in lib
LOBJS=lstr.o ldb.o lrec.o lfmt.o luti.o lio.o lqry.o lbt.o lcs.o lses.o lfdt.o lstb.o ldsp.o lcli.o lenc.o leva.o
# object files in server lib
LSVOBJS=$(O)/lsv.o
# classes in jar
ifeq ($(J2EE),)
	EECLASSES=
else
#	additional utilities requiring at least basic j2ee libs javax.mail, org.xml
#	you might have to add something like that to your CLASSPATH
# /opt/tomcat/common/lib/mail.jar:/opt/tomcat/common/lib/activation.jar:/opt/tomcat/common/lib/xerces.jar
	EECLASSES=Mail RecToXml XmlToRec XmlTest
endif
CLASSES=Field Rec Db NativeDb PureDb Test Charset Fdt \
	PlainSerializer Utils $(EECLASSES)
XSUB=perl/blib/arch/auto/OpenIsis/OpenIsis.so

# standard make defines
CC=gcc
RANLIB=ranlib

# you may want to try jikes
JC=javac

# figure out where to find JNI ...
ifeq ($(JNIINC),)
	ifeq ($(JAVAHOME),)
	JAVAHOME=/usr/java/jdk1.3
	endif
	JNIINC=-I$(JAVAHOME)/include -I$(JAVAHOME)/include/linux
endif

#	running openisis
OPENISIS=$(BINARY)
RUNJAVA=LD_LIBRARY_PATH=mto java -classpath openisis.jar:$(CLASSPATH)

ifneq ($(WIN32),)
	JTARGETS=openisis.jar openjsis.dll
	# Note that console output redirection doesn't work well
	# older wine 20010731 often croaks "FIXME:pthread_rwlock_rdlock"
	# since 200111*, console output didn't work at all
	# some versions should support wine -console tty 
	OPENISIS=wine -- win/openisis
	include make.mingw
	tclsubdir=win
endif



# DBG=
ifeq ($(NDEBUG),)
DBG=-g
else
DBG=-DNDEBUG
endif
# ARCH=-march=i586 


# compile
CPPFLAGS=
# note that -O is necessary for -Wuninitialized warnings
# -fstack-check ???
ifeq (,$(WIN32))
	PIC=-fPIC
else
	PIC=
endif
CFLAGS=$(DBG) -O2 -Wall -W -Wshadow -pedantic -Wno-long-long $(PIC)



#	############################# link ##################################
# common linker flags
LDFLAGS=

# link statically from openisis.a
# do not use -static, since we don't want to slurp in libc
LDSTATIC=$(LDFLAGS)

# create shared object
LDSHARED=$(LDFLAGS) -shared -Wl,-init,openIsisInit,-fini,openIsisFini

# link using shared object - the default
LDDYNAM=$(LDFLAGS)

SYSLIBS=
ifeq (solaris,$(OSTYPE))
	# rt for nanosleep
	SYSLIBS=-lrt -lsocket -lnsl
endif
LDLIBS=$(SYSLIBS)


# DB to use -- define DB for db/DB/DB, or DBDIR for other path
ifeq ($(DB),)
	DB=cds
endif
ifeq ($(DBDIR),)
	DBDIR=db/$(DB)/$(DB)
endif

# single and multi threaded objects
STOBJS=$(LOBJS:l%=$(STO)/l%)
MTOBJS=$(LOBJS:l%=mto/l%)



#	############################# targets ##################################
#
# standard default target
all: $(TARGETS)

.PHONY: all clean run demo lstbtest lrectest perl jar java jdoc tcl tk
# do not delete intermediates
.PRECIOUS: org/openisis/%.java %.class %.h

clean:
	rm -rf sto mto win *.jar *.tmp *.exp org/openisis/*.class core jdoc Makefile.old testout.txt
	[ ! -f perl/Makefile ] || make -C perl clean
	make -C tcl clean

$(O)/libopenisis.a: $(LOBJS:l%=$(O)/l%)
	$(AR) $(ARFLAGS) $@ $^
	$(RANLIB) $@

$(O)/libopenisis.so: $(LOBJS:l%=$(O)/l%)
	$(CC) $(LDSHARED) $(LDLIBS) -o $@ $^

$(O)/liboisrv.a: $(LSVOBJS)
	$(AR) $(ARFLAGS) $@ $^
	$(RANLIB) $@

$(O)/openisis$(EXE): $(O)/openisis.o $(O)/libopenisis.a
	$(CC) $(DBG) $(LDSTATIC) $(LDLIBS) $(MTLIBS) -o $@ $^

shared: $(O)/openisis.o $(O)/libopenisis.so
	$(CC) $(DBG) $(LDDYNAM) -o $(O)/openisis $^

win32:
	@ $(MAKE) --no-print-directory WIN32=sorry



#	########################## demos and tests ###############################
#
demo: $(O)/demo
	$(O)/demo -db $(DBDIR) 42

$(O)/demo: $(O)/demo.o  $(O)/libopenisis.a
	$(CC) $(DBG) -o $@ $^

lrectest: $(O)/lrectest
	$(O)/lrectest

$(O)/lrectest: $(O)/lrectest.o $(O)/libopenisis.a
	$(CC) $(DBG) $(LDLIBS) -o $@ $^

lstbtest: $(O)/lstbtest
	$(O)/lstbtest

$(O)/lstbtest: $(O)/lstbtest.o $(O)/libopenisis.a
	$(CC) $(DBG) $(LDLIBS) -o $@ $^

$(STO)/oipl: oipl.c
	$(CC) $(CPPFLAGS) $(CFLAGS) -rdynamic -ldl -o $@ $^

ois: $(O)/ois
	:

$(O)/ois: $(O)/ois.o $(O)/libopenisis.a $(O)/liboisrv.a
	$(CC) $(LDSTATIC) $^ $(LDLIBS) $(MTLIBS) -o $@


run: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -db $(DBDIR) $(FMT) 2>&1 | less

dump: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -db $(DBDIR) $(FMT)

recode: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -db $(DBDIR) $(FMT) | recode 850/..Latin-1

check: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -db $(DBDIR) -check

search: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -search 'development$$' -db $(DBDIR) $(FMT) 2>&1 | less

searchdump: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -search '$$' -db $(DBDIR) $(FMT) 2>&1

terms: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -terms '$$' -db $(DBDIR) $(FMT) 2>&1 | less

test: $(BINARY)
	$(OPENISIS) -scan development -fmt prop -db $(DBDIR) >testout.txt
	$(OPENISIS) -terms '$$' -fmt prop -db $(DBDIR) >>testout.txt
	$(OPENISIS) -search 'devel$$' -fmt mfnf -db $(DBDIR) >>testout.txt
	diff testout.txt testres.txt

crash: $(BINARY)
	time $(OPENISIS) -v $${V:-warn} -crash 'Z$$' -db db/unesb/unesb

searchtest: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -fmt mfnf -search 'a$$' -db $(DBDIR) $(FMT) >testout.txt
	diff testout.txt searchtest.txt

pftest: $(BINARY)
	$(OPENISIS) -v $${V:-warn} -search 'Dacca' -db $(DBDIR) \
	-pft "$${PFT:-`cat test.pft`}"

shsearch: shared
	LD_LIBRARY_PATH=$(O) $(OPENISIS) -v $${V:-debug} -search development -db $(DBDIR) $(FMT) 2>&1 | less

# take your time :)
time: $(BINARY)
	free
	time $(OPENISIS) -perf 100000 -db $(DBDIR) >/dev/null
	free

# time results for the unesb perf test differ dramatically
# depending on the working of operating system caching
# you may achive about 0.40 sec (12.000 recs per sec)
# but immediatly after timing the cds,
# the same test may take more than 40 sec
utime: $(BINARY)
	free
	time $(OPENISIS) -perf 5000 -db db/unesb/unesb >/dev/null
	free
	time $(OPENISIS) -fmt mfnf -search 'k$$' -db db/unesb/unesb >/dev/null




#	############################# perl ##################################
#
# 
perl: $(XSUB)
	:
	: ++++++++++++++++++++++++++++++++++++++++++++++++++++++
	: +++ as root in the perl subdir, run 'make install' +++
	: ++++++++++++++++++++++++++++++++++++++++++++++++++++++

ptest: $(XSUB)
	@$(MAKE) -C perl test

perl/Makefile: perl/Makefile.PL
	cd perl && perl Makefile.PL

# perl's Makefile doesn't know all deps
$(XSUB): perl/OpenIsis.pm perl/OpenIsis.xs openisis.h $(STO)/libopenisis.a perl/Makefile
	@-[ ! -f perl/OpenIsis.c ] || rm  perl/OpenIsis.c
	@$(MAKE) -C perl

#	standalone tree with OpenIsis module
perltree: $(XSUB)
	@-[ -d perl/tmptree/auto/OpenIsis ] || mkdir -p perl/tmptree/auto/OpenIsis
	cp -p perl/OpenIsis.pm perl/tmptree
	cp -p $(XSUB) perl/tmptree/auto/OpenIsis
	- strip perl/tmptree/auto/OpenIsis/OpenIsis.so

pdemo: perltree
	perl/demo.pl



#	############################# tcl ##################################
#
tcl: $(O)/libopenisis.a
	@$(MAKE) -C tcl bin/isish

tk: $(O)/libopenisis.a
	@$(MAKE) -C tcl bin/wisish

tcltk: tcl tk

ttest: tcl
	@$(MAKE) -C tcl test




#	############################# java ##################################
#
java: $(JTARGETS)
	:

jtest: java
	$(RUNJAVA) \
	org.openisis.Test -v $${V:-warn} -db $(DBDIR) -encoding Cp850 \
	-row 42 \
	-search development \
	-terms '' \
	-mpu -row 130 \
	-mhl -hta -row 130 \
	-m1 -row 130 \
	>testout.txt
	diff testout.txt jtest.txt

jcrash: java
	$(RUNJAVA) \
	org.openisis.Test -v $${V:-warn} -dbpath db/unesb -db unesb \
	-crash Z

# print in cds1.pft format
jcds1: java
	$(RUNJAVA) \
	org.openisis.Test -v $${V:-warn} -db $(DBDIR) -encoding Cp850 \
	-m1 -dump

jtime: java
	$(RUNJAVA) \
	org.openisis.Test -search 'a$$' -v $${V:-warn} \
	-db db/unesb/unesb >/dev/null

jdump: java
	$(RUNJAVA) \
	org.openisis.Test -v 9 -db $(DBDIR) 2>&1 | less

jwrite: java
	$(RUNJAVA) \
	org.openisis.Test -v 9 -db $(DBDIR) -write

jxml: java
ifeq ($(J2EE),)
	echo please be shure to have org.xml. stuff in your CLASSPATH
	$(MAKE) J2EE=1 jxml
else
	$(RUNJAVA) \
	-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser \
	org.openisis.XmlTest $${testxml:-test.xml}
endif

#		-overview overview.html
jdoc:
	- mkdir jdoc
	javadoc \
		-sourcepath . \
		-encoding ISO-8859-1 \
		-J-Xmx64m \
		-d jdoc \
		-use \
		-version \
		-author \
		-windowtitle 'org.openisis source code documentation' \
		-doctitle 'org.openisis source code documentation' \
		-header 'org.openisis source code documentation' \
		-footer 'this is <b>public</b> material' \
		-bottom 'for <b>your</b> eyes only' \
		-stylesheetfile jdocstyle.css \
		-charset "iso-8859-1" \
		org.openisis

charset: java
	mkdir -p db/charset
	$(RUNJAVA) \
	org.openisis.Charset -utf8seq >db/charset/charset.seq
	mx seq=db/charset/charset.seq create=db/charset/charset -all now tell=1
	mx db/charset/charset fst='1 1 MHL,V1' \
	ln1=db/charset/charset.lk1 ln2=db/charset/charset.lk2 +fix -all now tell=1
	ifload db/charset/charset db/charset/charset.lk1 db/charset/charset.lk2 \
	+fix tell=1 -reset -balan
	$(RUNJAVA) \
	org.openisis.Charset

#	make additional ee classes
j2ee:	openisis.jar $(EECLASSES:%=org/openisis/%.class)
	:

# openisis.jar: $(foreach cls,$(CLASSES),org/openisis/$(cls).class)
openisis.jar: $(CLASSES:%=org/openisis/%.class)
	jar cvf $@ org/openisis/*.class

%.class: %.java
	$(JC) -classpath .:$(CLASSPATH) $<

%.h: %.class
	javah -jni -o $@ $(subst /,.,$*)

ifneq ($(O),mto)
mto/libopenjsis.so: openjsis.c $(MTOBJS)
	$(MAKE) MT=1 $@
else
mto/openjsis.o: openjsis.c
	@- [ -d mto ] || mkdir mto
	$(CC) -c $(CPPFLAGS) $(CFLAGS) $(MTFLAGS) $(JNIINC) -o $@ $<

mto/libopenjsis.so: mto/openjsis.o mto/libopenisis.a
	$(CC) $(LDSHARED) -o $@ $^
endif

%.dll: 
	$(CC) -mdll -o junk.tmp -Wl,--base-file,$*.tmp $($*_deps)
	dlltool --dllname $@ --base-file $*.tmp \
		--output-exp $*.exp --input-def $*.def
	dlltool --dllname $@ --input-def $*.def \
		--output-lib lib$*.a
	gcc -mdll -mconsole -o $@ $($*_deps) -Wl,$*.exp,--enable-stdcall-fixup

# dependences of win32 dlls
# note on cross-builds: make sure you have the proper jni headers included - 
# those supplied for the target platform
openjsis_deps=openjsis.o $(LOBJS)
openjsis.dll: $(openjsis_deps)



#	############################# rules ##################################
#
# $@ target $^ all prerequisites $? newer $< first $* stem
#
mto/%.o: %.c
	@- [ -d mto ] || mkdir mto
	$(CC) -c $(CPPFLAGS) $(MTFLAGS) $(CFLAGS) -o $@ $<

# sto or win
$(STO)/%.o: %.c
	@- [ -d $(STO) ] || mkdir $(STO)
	$(CC) -c $(CPPFLAGS) $(CFLAGS) -o $@ $<


# maintenance targets ... most need a posix shell
ci: clean
	: +++ enter checkin message +++
	-read msg && ci -l -m"$$msg" *

Version: $(BINARY)
	echo "OpenIsis	`$(OPENISIS) -version`" >Version
	./lscvs -lr | sort >>Version

tar: Version
	@-[ -d tar ] || mkdir tar
	./lscvs -r | sort | tar czvfT tar/openisis.`$(OPENISIS) -version`.tgz -

snap: clean
	@-[ -d tar ] || mkdir tar
	tar czvf tar/oi`date +%y%m%d`.tgz . --exclude CVS --exclude tar --exclude WEB-INF

headers:
	for f in *.h *.c */*.h */*.c perl/*.xs org/openisis/*.java; do \
		cat Header.txt >$$f.tmp; \
		sed -e '1,/^EOH/d' $$f >>$$f.tmp; \
		mv -f $$f.tmp $$f; \
	done
	for f in `grep -rl '^#EOH' .`; do \
		head -n 1 $$f >$$f.tmp; \
		sed -e 's/^/#/' Header.txt >>$$f.tmp; \
		sed -e '1,/^#EOH/d' $$f >>$$f.tmp; \
		echo $$f; \
		diff $$f $$f.tmp; \
		mv -f $$f.tmp $$f; \
	done

# please do not try to make deps w/o sed, gcc and mv ...
deps:
	gcc -MM `./lscvs |grep '\.c$$' |sort` >deps.tmp
	sed -n -e '1,/^# generated deps/p' Makefile >Makefile.tmp
	sed -e '/^[^ ]/s/^/mto\//' <deps.tmp >>Makefile.tmp
	sed -e '/^[^ ]/s/^/$$(STO)\//' <deps.tmp >>Makefile.tmp
	rm deps.tmp
	mv -f Makefile Makefile.old
	mv Makefile.tmp Makefile
	-diff Makefile Makefile.old

# generated deps -- do not edit below this line
mto/demo.o: demo.c openisis.h
mto/ioperf.o: ioperf.c
mto/lbt.o: lbt.c lio.h luti.h loi.h openisis.h lll.h lbt.h ldb.h
mto/lcli.o: lcli.c openisis.h loi.h lio.h luti.h lll.h lcli.h
mto/lcs.o: lcs.c luti.h loi.h openisis.h lio.h lll.h lcs.h
mto/ldb.o: ldb.c lstr.h lio.h luti.h loi.h openisis.h lll.h lbt.h ldb.h \
 lcs.h lfdt.h
mto/ldsp.o: ldsp.c openisis.h loi.h ldb.h luti.h lll.h ldsp.h lfdt.h
mto/lenc.o: lenc.c openisis.h ldsp.h
mto/leva.o: leva.c openisis.h ldsp.h
mto/lfdt.o: lfdt.c openisis.h loi.h lfdt.h luti.h
mto/lfmt.o: lfmt.c ldb.h luti.h loi.h openisis.h lll.h
mto/lio.o: lio.c luti.h loi.h openisis.h lses.h lio.h lll.h lstr.h
mto/lqry.o: lqry.c ldb.h luti.h loi.h openisis.h lll.h
mto/lrec.o: lrec.c ldb.h luti.h loi.h openisis.h lll.h lio.h lcs.h
mto/lrectest.o: lrectest.c openisis.h loi.h lfdt.h luti.h
mto/lses.o: lses.c lses.h loi.h openisis.h lio.h luti.h lll.h
mto/lstb.o: lstb.c openisis.h loi.h lcli.h ldb.h luti.h lll.h ldsp.h \
 lfdt.h
mto/lstbtest.o: lstbtest.c openisis.h loi.h ldb.h luti.h lll.h
mto/lstr.o: lstr.c lstr.h luti.h loi.h openisis.h
mto/lsv.o: lsv.c lsv.h loi.h openisis.h lio.h luti.h lll.h lses.h
mto/luti.o: luti.c openisis.h luti.h loi.h
mto/mlock.o: mlock.c
mto/oipl.o: oipl.c
mto/ois.o: ois.c lsv.h loi.h openisis.h lio.h luti.h lll.h lses.h ldsp.h
mto/openisis.o: openisis.c openisis.h lio.h luti.h loi.h lll.h
mto/openjsis.o: openjsis.c openisis.h org/openisis/NativeDb.h
mto/tpl.o: tpl.c ldb.h luti.h loi.h openisis.h lll.h
$(STO)/demo.o: demo.c openisis.h
$(STO)/ioperf.o: ioperf.c
$(STO)/lbt.o: lbt.c lio.h luti.h loi.h openisis.h lll.h lbt.h ldb.h
$(STO)/lcli.o: lcli.c openisis.h loi.h lio.h luti.h lll.h lcli.h
$(STO)/lcs.o: lcs.c luti.h loi.h openisis.h lio.h lll.h lcs.h
$(STO)/ldb.o: ldb.c lstr.h lio.h luti.h loi.h openisis.h lll.h lbt.h ldb.h \
 lcs.h lfdt.h
$(STO)/ldsp.o: ldsp.c openisis.h loi.h ldb.h luti.h lll.h ldsp.h lfdt.h
$(STO)/lenc.o: lenc.c openisis.h ldsp.h
$(STO)/leva.o: leva.c openisis.h ldsp.h
$(STO)/lfdt.o: lfdt.c openisis.h loi.h lfdt.h luti.h
$(STO)/lfmt.o: lfmt.c ldb.h luti.h loi.h openisis.h lll.h
$(STO)/lio.o: lio.c luti.h loi.h openisis.h lses.h lio.h lll.h lstr.h
$(STO)/lqry.o: lqry.c ldb.h luti.h loi.h openisis.h lll.h
$(STO)/lrec.o: lrec.c ldb.h luti.h loi.h openisis.h lll.h lio.h lcs.h
$(STO)/lrectest.o: lrectest.c openisis.h loi.h lfdt.h luti.h
$(STO)/lses.o: lses.c lses.h loi.h openisis.h lio.h luti.h lll.h
$(STO)/lstb.o: lstb.c openisis.h loi.h lcli.h ldb.h luti.h lll.h ldsp.h \
 lfdt.h
$(STO)/lstbtest.o: lstbtest.c openisis.h loi.h ldb.h luti.h lll.h
$(STO)/lstr.o: lstr.c lstr.h luti.h loi.h openisis.h
$(STO)/lsv.o: lsv.c lsv.h loi.h openisis.h lio.h luti.h lll.h lses.h
$(STO)/luti.o: luti.c openisis.h luti.h loi.h
$(STO)/mlock.o: mlock.c
$(STO)/oipl.o: oipl.c
$(STO)/ois.o: ois.c lsv.h loi.h openisis.h lio.h luti.h lll.h lses.h ldsp.h
$(STO)/openisis.o: openisis.c openisis.h lio.h luti.h loi.h lll.h
$(STO)/openjsis.o: openjsis.c openisis.h org/openisis/NativeDb.h
$(STO)/tpl.o: tpl.c ldb.h luti.h loi.h openisis.h lll.h