
# Makefile for building PyLucene
#
# Supported operating systems: Linux, Mac OS X and Windows.
# See INSTALL file for requirements.
# 
# Steps to build
#   1. Edit the sections below as documented
#   2. make all
#   3. make install
#
# The install target installs the PyLucene python extension in python's
# site-packages directory. On Mac OS X, it also installs the gcj runtime
# libraries into $(PREFIX)/lib. When Berkeley DB support is enabled, 
# the libdb_java JNI shared library is installed with your Berkeley DB
# binaries as follows: 
#   - on Unix (Mac OS X, FreeBSD and Linux), where your DB binaries are
#     installed 
#   - on Windows, where your DB binaries are built
#
# To successfully import the PyLucene extension into Python, all required
# libraries need to be found. If the locations you chose are non-standard,
# the relevant DYLD_LIBRARY_PATH (Mac OS X), LD_LIBRARY_PATH (Linux and
# FreeBSD), or PATH (Windows) need to be set accordingly.
# 

# 
# You need to verify that the versions of python and Berkeley DB, should
# you require it, are correct below.
# 

VERSION=2.0.0-5
LUCENE_SVN_VER=478273
LUCENE_VER=2.0.0-$(LUCENE_SVN_VER)
LUCENE_SVN=http://svn.apache.org/repos/asf/lucene/java/trunk
PYTHON_VER=2.4
#DB_VER=4.3.29
DB_VER=4.4.20

PYLUCENE:=$(shell pwd)
LUCENE=lucene-java-$(LUCENE_VER)
DB_LIB_VER=$(basename $(DB_VER))

# 
# You need to uncomment and edit the variables below in the section
# corresponding to your operating system.
#
# Windows drive-absolute paths need to be expressed cygwin style.
#
# PREFIX: where programs are normally installed on your system (Unix).
# PREFIX_PYTHON: where your version of python is installed.
# GCJ_HOME: where GCC/GCJ is installed.
#
# Uncommenting DB enables Berkeley DB support. The variables below are only
# required for Berkeley DB support and should remain commented if Berkekey
# DB support is not desired.
#
# DB: where your sources for Berkeley DB are installed.
# PREFIX_DB: where your binaries for Berkeley DB are installed (Unix).
# PREFIX_DB: where your sources for Berkeley DB are installed (Windows).
#

# Mac OS X (Darwin with gcj 3.4.4 and libgcj statically linked)
#PREFIX=/usr/local
#PREFIX_FRAMEWORKS=/Library/Frameworks
#PREFIX_PYTHON=$(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)
#GCJ_HOME=/usr/local/gcc-3.4.4
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=1
#LIB_INSTALL=libstdc++.6.dylib libgcc_s.1.0.dylib
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=/usr/local/BerkeleyDB.$(DB_LIB_VER)
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python

# Mac OS X (Darwin with gcj 3.4.4 and libgcj dynamically linked)
#PREFIX=/usr/local
#PREFIX_FRAMEWORKS=/Library/Frameworks
#PREFIX_PYTHON=$(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)
#GCJ_HOME=/usr/local/gcc-3.4.4
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=0
#LIB_INSTALL=libgcj.5.dylib libstdc++.6.dylib libgcc_s.1.0.dylib
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=/usr/local/BerkeleyDB.$(DB_LIB_VER)
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python

# Mac OS X (Darwin with gcj 4.0.2 and libgcj dynamically linked)
#PREFIX=/usr/local
#PREFIX_FRAMEWORKS=/Library/Frameworks
#PREFIX_PYTHON=$(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)
#GCJ_HOME=/usr/local/gcc-4.0.2
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=0
#LIB_INSTALL=libgcj.6.dylib libstdc++.6.dylib libgcc_s.1.0.dylib
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=/usr/local/BerkeleyDB.$(DB_LIB_VER)
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python

# Mac OS X (Darwin with gcj 4.1.0 and python 2.4 from darwinports)
#PREFIX=/opt/local
#PREFIX_FRAMEWORKS=$(PREFIX)/Library/Frameworks
#PREFIX_PYTHON=$(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)
#GCJ_HOME=$(PREFIX)
#GCJ_LIBDIR=$(GCJ_HOME)/lib/gcc41
#GCJ_STATIC=0
#LIB_INSTALL=
#LIBGCC_S_VER=.1
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=/usr/local/BerkeleyDB.$(DB_LIB_VER)
#CC=$(GCJ_HOME)/bin/gcc-dp-4.1
#CXX=$(GCJ_HOME)/bin/g++-dp-4.1
#JCC=$(GCJ_HOME)/bin/gcj-dp-4.1
#JCCH=$(GCJ_HOME)/bin/gcjh-dp-4.1
#ANT=ant
#PYTHON=$(PREFIX)/bin/python

# Linux (with gcc 3.4.4 and libgcj statically linked)
#PREFIX=/usr/local
#PREFIX_PYTHON=$(PREFIX)
#GCJ_HOME=/usr/local/gcc-3.4.4
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=1
#LIB_INSTALL=libstdc++.so.6 libgcc_s.so.1
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=$(PREFIX)/BerkeleyDB.$(DB_LIB_VER)
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python

# FreeBSD
#PREFIX=/usr/local
#PREFIX_PYTHON=$(PREFIX)
#GCJ_HOME=/usr/local
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=0
#LIB_INSTALL=
#DB=$(PYLUCENE)/db-$(DB_VER)
#PREFIX_DB=$(PREFIX)/BerkeleyDB.$(DB_LIB_VER)
#CC=$(GCJ_HOME)/bin/gcc41
#CXX=$(GCJ_HOME)/bin/g++41
#JCC=$(GCJ_HOME)/bin/gcj41
#JCCH=$(GCJ_HOME)/bin/gcjh41
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python

# Windows (with gcj 3.4.6 and libs statically linked)
#PREFIX_PYTHON=/cygdrive/o/Python-2.4.3
#GCJ_HOME=/cygdrive/o/mingw-5.0-3.4.6
#GCJ_LIBDIR=$(GCJ_HOME)/lib
#GCJ_STATIC=1
#LIB_INSTALL=
#DB=/cygdrive/o/db-$(DB_VER)
#PREFIX_DB=$(DB)
#ANT=ant
#PYTHON=$(PREFIX_PYTHON)/bin/python.exe

#
# No edits required below
#

OS=$(shell uname)
ifeq ($(findstring CYGWIN,$(OS)),CYGWIN)
OS=Cygwin
endif
ifeq ($(findstring WINNT,$(OS)),WINNT)
OS=Cygwin
endif

ifeq ($(DEBUG),1)
COMP_OPT=DEBUG=1
SUFFIX=d
_SUFFIX=
BINDIR=debug
else
COMP_OPT=
SUFFIX=
_SUFFIX=
BINDIR=release
endif

DEFINES=-DPYLUCENE_VER="\"$(VERSION)\"" -DLUCENE_VER="\"$(LUCENE_VER)\""

JCCFLAGS=--encoding=UTF-8

ifeq ($(OS),Darwin)
PYTHON_SITE=$(PREFIX_PYTHON)/lib/python$(PYTHON_VER)/site-packages
PYTHON_INC=$(PREFIX_PYTHON)/Headers
PYLUCENE_LIB=$(BINDIR)/_PyLucene.so
ifeq ($(DEBUG),1)
CCFLAGS=-O0 -g
LDFLAGS=
else
CCFLAGS=-O2
LDFLAGS=
endif
STRIP=strip -S
else

ifeq ($(OS),Linux)
PYTHON_SITE=$(PREFIX_PYTHON)/lib/python$(PYTHON_VER)/site-packages
PYTHON_INC=$(PREFIX_PYTHON)/include/python$(PYTHON_VER)
PYLUCENE_LIB=$(BINDIR)/_PyLucene.so
ifeq ($(DEBUG),1)
CCFLAGS=-O0 -g -fPIC
LDFLAGS=-g
else
CCFLAGS=-O2 -fPIC
LDFLAGS=
endif
STRIP=strip
else

ifeq ($(OS),FreeBSD)
PYTHON_SITE=$(PREFIX_PYTHON)/lib/python$(PYTHON_VER)/site-packages
PYTHON_INC=$(PREFIX_PYTHON)/include/python$(PYTHON_VER)
PYLUCENE_LIB=$(BINDIR)/_PyLucene.so
ifeq ($(DEBUG),1)
CCFLAGS=-O0 -g -fPIC
LDFLAGS=-g
else
CCFLAGS=-O2 -fPIC
LDFLAGS=
endif
STRIP=strip
else

ifeq ($(OS),Cygwin)
PYTHON_SITE=`cygpath -aw $(PREFIX_PYTHON)/Lib/site-packages`
PYTHON_INC=$(PREFIX_PYTHON)/Include:$(PREFIX_PYTHON)/PC
PYLUCENE_LIB=$(BINDIR)/_PyLucene$(_SUFFIX).pyd
ifeq ($(DEBUG),1)
CCFLAGS=-O -g
LDFLAGS=-g
else
CCFLAGS=-O2
LDFLAGS=
endif
STRIP=strip
else

PYTHON=unknown
PYTHON_SITE=unknown
endif
endif
endif
endif

CLASSES=$(BINDIR)/classes

ifndef JCCH
CC=$(GCJ_HOME)/bin/gcc
CXX=$(GCJ_HOME)/bin/g++
JCC=$(GCJ_HOME)/bin/gcj
JCCH=$(GCJ_HOME)/bin/gcjh
endif

LUCENE_JAR=$(LUCENE)/build/lucene-core-$(LUCENE_VER).jar
SNOWBALL_JAR=$(LUCENE)/build/contrib/snowball/lucene-snowball-$(LUCENE_VER).jar
HIGHLIGHTER_JAR=$(LUCENE)/build/contrib/highlighter/lucene-highlighter-$(LUCENE_VER).jar
ANALYZERS_JAR=$(LUCENE)/build/contrib/analyzers/lucene-analyzers-$(LUCENE_VER).jar
REGEX_JAR=$(LUCENE)/build/contrib/regex/lucene-regex-$(LUCENE_VER).jar
QUERIES_JAR=$(LUCENE)/build/contrib/queries/lucene-queries-$(LUCENE_VER).jar

PYLUCENE_CP:=$(LUCENE_JAR):$(HIGHLIGHTER_JAR):$(SNOWBALL_JAR):$(ANALYZERS_JAR):$(CLASSES):$(REGEX_JAR)
PYLUCENE_INC:=$(LUCENE)/build/classes/java:$(LUCENE)/build/contrib/highlighter/classes/java:$(LUCENE)/build/contrib/snowball/classes/java:$(LUCENE)/build/contrib/analyzers/classes/java:$(LUCENE)/build/contrib/regex/classes/java:$(LUCENE)/build/contrib/queries/classes/java:$(CLASSES)

JAVA_OBJS=$(BINDIR)/lucene.jar.o \
          $(BINDIR)/snowball.jar.o \
          $(BINDIR)/highlighter.jar.o $(BINDIR)/analyzers.jar.o \
          $(BINDIR)/regex.jar.o $(BINDIR)/regex.cpp.o \
          $(BINDIR)/util.java.o $(BINDIR)/util.cpp.o \
          $(BINDIR)/io.java.o $(BINDIR)/io.cpp.o \
          $(BINDIR)/store.java.o $(BINDIR)/store.cpp.o \
          $(BINDIR)/search.java.o $(BINDIR)/search.cpp.o \
          $(BINDIR)/queryParser.java.o $(BINDIR)/queryParser.cpp.o \
          $(BINDIR)/analysis.java.o $(BINDIR)/analysis.cpp.o \
          $(BINDIR)/highlight.java.o $(BINDIR)/highlight.cpp.o \
          $(BINDIR)/queries.jar.o
LIBS=$(PYLUCENE_LIB)

.PHONY: distrib distrib-src install default all clean realclean \
        env patches sources test

default: all

patches.lucene:
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/queryParser/QueryParser.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/queryParser/QueryParser.java > $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/analysis/standard/StandardTokenizer.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/analysis/standard/StandardTokenizer.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/index/FieldInfos.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/index/FieldInfos.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/store/MMapDirectory.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/store/MMapDirectory.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/index/IndexFileNameFilter.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/index/IndexFileNameFilter.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/document/AbstractField.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/document/AbstractField.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/index/IndexWriter.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/index/IndexWriter.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/src/java/org/apache/lucene/index/IndexReader.java lucene-java-$(LUCENE_VER)-patched/src/java/org/apache/lucene/index/IndexReader.java >> $@; true
	diff -u lucene-java-$(LUCENE_VER)/contrib/queries/src/java/org/apache/lucene/search/similar/MoreLikeThis.java lucene-java-$(LUCENE_VER)-patched/contrib/queries/src/java/org/apache/lucene/search/similar/MoreLikeThis.java >> $@; true

patches.regex:
	diff -u lucene-java-$(LUCENE_VER)/contrib/regex/src/java/org/apache/lucene/search/regex/RegexQuery.java lucene-java-$(LUCENE_VER)-patched/contrib/regex/src/java/org/apache/lucene/search/regex/RegexQuery.java > $@; true
	diff -u lucene-java-$(LUCENE_VER)/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java lucene-java-$(LUCENE_VER)-patched/contrib/regex/src/java/org/apache/lucene/search/regex/SpanRegexQuery.java >> $@; true

env:
ifndef PREFIX_PYTHON
	@echo Operating system is $(OS)
	@echo You need to edit that section of the Makefile
	@false
else
	@true
endif


$(BINDIR):
	mkdir -p $(BINDIR)/classes

$(LUCENE):
	svn export -r $(LUCENE_SVN_VER) $(LUCENE_SVN) $(LUCENE)

sources: $(LUCENE)

to-orig: sources
	mkdir -p $(LUCENE)-orig
	tar -C $(LUCENE) -cf - . | tar -C $(LUCENE)-orig -xvf -

from-orig: $(LUCENE)-orig
	mkdir -p $(LUCENE)
	tar -C $(LUCENE)-orig -cf - . | tar -C $(LUCENE) -xvf -


ifdef DB

DB_JAR=$(LUCENE)/contrib/db/bdb/lib/db-$(DB_VER).jar
STORE_JAR=$(LUCENE)/build/contrib/db/bdb/lucene-bdb-$(LUCENE_VER).jar
STORE_O=$(BINDIR)/store.jar.o

PYLUCENE_CP:=$(PYLUCENE_CP):$(STORE_JAR)
PYLUCENE_INC:=$(PYLUCENE_INC):$(LUCENE)/build/contrib/db/bdb/classes/java


ifeq ($(OS),Darwin)
LIBDB_JAVA_LIB=$(BINDIR)/libdb_java-$(DB_LIB_VER).dylib
endif

ifeq ($(OS),Linux)
LIBDB_JAVA_LIB=$(BINDIR)/libdb_java-$(DB_LIB_VER).so
endif

ifeq ($(OS),FreeBSD)
LIBDB_JAVA_LIB=$(BINDIR)/libdb_java-$(DB_LIB_VER).so
endif

ifeq ($(OS),Cygwin)
LIBDB_JAVA_LIB=$(BINDIR)/libdb_java$(subst .,,$(DB_LIB_VER))$(SUFFIX).dll
endif

DISTRIB=distrib/PyLucene-db-$(VERSION)

patches.db-$(DB_LIB_VER):
	diff -u db-$(DB_VER)/libdb_java/db_java_wrap.c db-$(DB_VER)-patched/libdb_java/db_java_wrap.c > $@; true

PYLUCENE_CP:=$(PYLUCENE_CP):$(DB)/java/src

ifeq ($(OS),Cygwin)
BUILD_DB=build_win32
DB_INC=-I`cygpath -aw $(PREFIX_DB)` -I`cygpath -aw $(PREFIX_DB)/dbinc` -I`cygpath -aw $(PREFIX_DB)/$(BUILD_DB)`
PYLUCENE_CP:=`cygpath -awp $(PYLUCENE_CP)`
else
BUILD_DB=build_unix
DB_INC=-I$(PREFIX_DB)/include -I$(DB) -I$(DB)/$(BUILD_DB)
endif

JAVA_OBJS:=$(BINDIR)/store.jar.o $(BINDIR)/db.jar.o $(JAVA_OBJS)
LIBS:=$(LIBDB_JAVA_LIB) $(LIBS)
DEFINES:=$(DEFINES) -D_WITH_DB_DIRECTORY=1 -DDB_LIB_VER="\"$(DB_LIB_VER)\"" -DDB_VER=$(subst .,,$(DB_LIB_VER))

$(DB_JAR):
	curl -o $@ http://downloads.osafoundation.org/db/db-$(DB_VER).jar

$(BINDIR)/db.jar.o: $(DB_JAR)
	$(JCC) -fjni $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) $(DB_JAR)
	mkdir -p $(CLASSES)/com/sleepycat/db/internal
	$(JCCH) -d $(CLASSES) --classpath=$(DB_JAR) com.sleepycat.db.internal.DbEnv
	$(JCCH) -d $(CLASSES) --classpath=$(DB_JAR) com.sleepycat.db.internal.Db
	$(JCCH) -d $(CLASSES) --classpath=$(DB_JAR) com.sleepycat.db.internal.DbTxn

ifeq ($(OS),Darwin)
# with gcc 3.4.x, libdb_java segfaults when compiled with -O2
$(LIBDB_JAVA_LIB):
	$(CC) -dynamic -bundle -o $@ -O $(LDFLAGS) -I$(GCJ_HOME)/include $(DB_INC) $(DB)/libdb_java/db_java_wrap.c $(PREFIX_DB)/lib/libdb-$(DB_LIB_VER).dylib
else

ifeq ($(OS),Linux)
$(LIBDB_JAVA_LIB):
	$(CC) -shared -o $@ $(CCFLAGS) $(PYDBG) -I$(GCJ_HOME)/include $(DB_INC) $(DB)/libdb_java/db_java_wrap.c $(PREFIX_DB)/lib/libdb-$(DB_LIB_VER).so
else

ifeq ($(OS),FreeBSD)
$(LIBDB_JAVA_LIB):
	$(CC) -shared -o $@ $(CCFLAGS) $(PYDBG) -I$(GCJ_HOME)/include $(DB_INC) $(DB)/libdb_java/db_java_wrap.c $(PREFIX_DB)/lib/libdb-$(DB_LIB_VER).so
else

ifeq ($(OS),Cygwin)
$(LIBDB_JAVA_LIB): patches.db-$(DB_LIB_VER)
	chmod +w $(DB)/libdb_java/db_java_wrap.c
	cd $(DB); patch -Nup1 < $(PYLUCENE)/patches.db-$(DB_LIB_VER); echo ok
	$(CC) -shared -o $@ $(CCFLAGS) $(PYDBG) -D_NO_OLDNAMES -D_off_t=off_t -DGCJ $(DB_INC) `cygpath -aw $(DB)/libdb_java/db_java_wrap.c` `cygpath -aw $(PREFIX_DB)/build_win32/$(BINDIR)/libdb$(subst .,,$(DB_LIB_VER))$(SUFFIX).dll`
endif
endif
endif
endif

$(STORE_JAR): $(LUCENE_JAR)
	cd $(LUCENE)/contrib/db/bdb; $(ANT) -Dversion=$(LUCENE_VER) -Ddb.version=$(DB_VER)
	cd $(LUCENE)/build/contrib/db/bdb/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(BINDIR)/store.jar.o: $(STORE_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(STORE_JAR)

else

DISTRIB=distrib/PyLucene-$(VERSION)
DB_INC=
STORE_O=

ifeq ($(OS),Cygwin)
PYLUCENE_CP:=`cygpath -awp $(PYLUCENE_CP)`
endif

endif

DISTRIB_SRC=distrib/PyLucene-src-$(VERSION)

ifeq ($(OS),Cygwin)
PYLUCENE_INC:=$(patsubst %,-I`cygpath -aw %`,$(subst :, ,$(PYLUCENE_INC)))
CC_INC=$(patsubst %,-I`cygpath -aw %`,$(subst :, ,$(PYTHON_INC):$(GCJ_HOME)/include))
else
PYLUCENE_INC:=$(patsubst %,-I%,$(subst :, ,$(PYLUCENE_INC)))
CC_INC=$(patsubst %,-I%,$(subst :, ,$(PYTHON_INC):$(GCJ_HOME)/include))
endif


lucene:
	rm -f $(LUCENE_JAR)
	$(MAKE) $(LUCENE_JAR)

$(LUCENE_JAR): $(LUCENE) patches.lucene
	cd $(LUCENE); patch -Nup1 < ../patches.lucene; echo ok
	cd $(LUCENE); $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(SNOWBALL_JAR): $(LUCENE_JAR)
	cd $(LUCENE)/contrib/snowball; $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/contrib/snowball/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(HIGHLIGHTER_JAR): $(LUCENE_JAR)
	cd $(LUCENE)/contrib/highlighter; $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/contrib/highlighter/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(ANALYZERS_JAR): $(LUCENE_JAR)
	cd $(LUCENE)/contrib/analyzers; $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/contrib/analyzers/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(REGEX_JAR): $(LUCENE_JAR)
	rm -f $(LUCENE)/contrib/regex/src/java/org/apache/lucene/search/regex/JavaUtilRegexCapabilities.java
	rm -f $(LUCENE)/contrib/regex/src/java/org/apache/lucene/search/regex/JakartaRegexpCapabilities.java
	rm -f $(LUCENE)/contrib/regex/src/java/org/apache/regexp/RegexpTunnel.java
	cp -p java/org/apache/lucene/search/regex/PythonRegexCapabilities.java $(LUCENE)/contrib/regex/src/java/org/apache/lucene/search/regex/PythonRegexCapabilities.java
	cd $(LUCENE); patch -Nup1 < ../patches.regex; echo ok	
	cd $(LUCENE)/contrib/regex; $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/contrib/regex/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(QUERIES_JAR): $(LUCENE_JAR)
	cd $(LUCENE)/contrib/queries; $(ANT) -Dversion=$(LUCENE_VER)
	cd $(LUCENE)/build/contrib/queries/classes/java; \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

$(BINDIR)/lucene.jar.o: $(LUCENE_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ $(LUCENE_JAR)

$(BINDIR)/snowball.jar.o: $(SNOWBALL_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(SNOWBALL_JAR)

$(BINDIR)/highlighter.jar.o: $(HIGHLIGHTER_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(HIGHLIGHTER_JAR)

$(BINDIR)/analyzers.jar.o: $(ANALYZERS_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(ANALYZERS_JAR)

$(BINDIR)/regex.jar.o: $(REGEX_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(REGEX_JAR)

$(BINDIR)/queries.jar.o: $(QUERIES_JAR)
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
               $(QUERIES_JAR)

$(BINDIR)/util.java.o: $(LUCENE_JAR) \
                       java/org/osafoundation/util/PythonComparable.java \
                       java/org/osafoundation/util/PythonRunnable.java \
                       java/org/osafoundation/util/PythonException.java \
                       java/org/osafoundation/util/IndexReaderEnumeration.java \
                       java/org/osafoundation/util/TokenEnumeration.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/util/PythonComparable.java \
            java/org/osafoundation/util/PythonRunnable.java \
            java/org/osafoundation/util/PythonException.java \
            java/org/osafoundation/util/IndexReaderEnumeration.java \
            java/org/osafoundation/util/TokenEnumeration.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -c -o $@ --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/util/PythonComparable.java \
            java/org/osafoundation/util/PythonRunnable.java \
            java/org/osafoundation/util/PythonException.java \
            java/org/osafoundation/util/IndexReaderEnumeration.java \
            java/org/osafoundation/util/TokenEnumeration.java

$(BINDIR)/io.java.o: java/org/osafoundation/io/PythonReader.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
            java/org/osafoundation/io/PythonReader.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
            java/org/osafoundation/io/PythonReader.java

$(BINDIR)/store.java.o: $(LUCENE_JAR) \
                        java/org/osafoundation/store/PythonDirectory.java \
                        java/org/osafoundation/store/PythonIndexInput.java \
                        java/org/osafoundation/store/PythonIndexOutput.java \
                        java/org/osafoundation/store/PythonLock.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/store/PythonDirectory.java \
            java/org/osafoundation/store/PythonIndexInput.java \
            java/org/osafoundation/store/PythonIndexOutput.java \
            java/org/osafoundation/store/PythonLock.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/store/PythonDirectory.java \
            java/org/osafoundation/store/PythonIndexInput.java \
            java/org/osafoundation/store/PythonIndexOutput.java \
            java/org/osafoundation/store/PythonLock.java

$(BINDIR)/search.java.o: $(LUCENE_JAR) \
    java/org/osafoundation/search/PythonSortComparatorSource.java \
    java/org/osafoundation/search/PythonSortComparator.java \
    java/org/osafoundation/search/PythonScoreDocComparator.java \
    java/org/osafoundation/search/PythonFilter.java \
    java/org/osafoundation/search/PythonHitCollector.java \
    java/org/osafoundation/search/PythonSimilarity.java \
    java/org/osafoundation/search/PythonFilteredTermEnum.java \
    java/org/osafoundation/search/PythonSearcher.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/search/PythonSortComparatorSource.java \
            java/org/osafoundation/search/PythonSortComparator.java \
            java/org/osafoundation/search/PythonScoreDocComparator.java \
            java/org/osafoundation/search/PythonFilter.java \
            java/org/osafoundation/search/PythonHitCollector.java \
            java/org/osafoundation/search/PythonSimilarity.java \
            java/org/osafoundation/search/PythonFilteredTermEnum.java \
            java/org/osafoundation/search/PythonSearcher.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/search/PythonSortComparatorSource.java \
            java/org/osafoundation/search/PythonSortComparator.java \
            java/org/osafoundation/search/PythonScoreDocComparator.java \
            java/org/osafoundation/search/PythonFilter.java \
            java/org/osafoundation/search/PythonHitCollector.java \
            java/org/osafoundation/search/PythonSimilarity.java \
            java/org/osafoundation/search/PythonFilteredTermEnum.java \
            java/org/osafoundation/search/PythonSearcher.java

$(BINDIR)/queryParser.java.o: $(LUCENE_JAR) \
    java/org/osafoundation/queryParser/PythonQueryParser.java \
    java/org/osafoundation/queryParser/PythonMultiFieldQueryParser.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/queryParser/PythonQueryParser.java \
            java/org/osafoundation/queryParser/PythonMultiFieldQueryParser.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/queryParser/PythonQueryParser.java \
            java/org/osafoundation/queryParser/PythonMultiFieldQueryParser.java

$(BINDIR)/analysis.java.o: $(LUCENE_JAR) \
    java/org/osafoundation/analysis/PythonAnalyzer.java \
    java/org/osafoundation/analysis/PythonTokenStream.java \
    java/org/osafoundation/analysis/PythonTokenFilter.java \
    java/org/osafoundation/analysis/PythonCharTokenizer.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/analysis/PythonAnalyzer.java \
            java/org/osafoundation/analysis/PythonTokenStream.java \
            java/org/osafoundation/analysis/PythonTokenFilter.java \
            java/org/osafoundation/analysis/PythonCharTokenizer.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/analysis/PythonAnalyzer.java \
            java/org/osafoundation/analysis/PythonTokenStream.java \
            java/org/osafoundation/analysis/PythonTokenFilter.java \
            java/org/osafoundation/analysis/PythonCharTokenizer.java

$(BINDIR)/highlight.java.o: $(HIGHLIGHTER_JAR) \
    java/org/osafoundation/search/highlight/PythonFormatter.java \
    java/org/osafoundation/search/highlight/PythonFragmenter.java
	$(JCC) $(JCCFLAGS) -C -d $(CLASSES) \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/search/highlight/PythonFormatter.java \
            java/org/osafoundation/search/highlight/PythonFragmenter.java
	$(JCC) $(JCCFLAGS) $(CCFLAGS) -I$(GCJ_HOME)/include -c -o $@ \
               --classpath=$(PYLUCENE_CP) \
            java/org/osafoundation/search/highlight/PythonFormatter.java \
            java/org/osafoundation/search/highlight/PythonFragmenter.java

$(BINDIR)/util.cpp.o: $(CLASSES)/org/osafoundation/util/PythonException.h \
                      cpp/PythonUtil.cpp $(BINDIR)/util.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonUtil.cpp

$(BINDIR)/io.cpp.o: $(CLASSES)/org/osafoundation/util/PythonException.h \
                    cpp/PythonIO.cpp $(BINDIR)/io.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonIO.cpp

$(BINDIR)/store.cpp.o: $(CLASSES)/org/osafoundation/util/PythonException.h \
                       cpp/PythonStore.cpp $(BINDIR)/store.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonStore.cpp

$(BINDIR)/search.cpp.o: \
    $(CLASSES)/org/osafoundation/util/PythonException.h \
    cpp/PythonSearch.cpp $(BINDIR)/search.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonSearch.cpp

$(BINDIR)/queryParser.cpp.o: \
    $(CLASSES)/org/osafoundation/util/PythonException.h \
    cpp/PythonQueryParser.cpp $(BINDIR)/search.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonQueryParser.cpp

$(BINDIR)/analysis.cpp.o: \
    $(CLASSES)/org/osafoundation/util/PythonException.h \
    cpp/PythonAnalysis.cpp $(BINDIR)/analysis.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonAnalysis.cpp

$(BINDIR)/highlight.cpp.o: \
    $(CLASSES)/org/osafoundation/util/PythonException.h \
    cpp/PythonHighlight.cpp $(BINDIR)/highlight.java.o
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonHighlight.cpp

$(BINDIR)/regex.cpp.o: \
    $(CLASSES)/org/osafoundation/util/PythonException.h \
    cpp/PythonRegex.cpp $(REGEX_JAR)
	$(CXX) $(PYLUCENE_INC) $(CC_INC) $(CCFLAGS) $(PYDBG) -c -o $@ cpp/PythonRegex.cpp


$(CLASSES)/org/osafoundation/util/PythonException.h: \
    $(BINDIR)/lucene.jar.o \
    $(BINDIR)/snowball.jar.o \
    $(BINDIR)/analyzers.jar.o \
    $(BINDIR)/highlighter.jar.o \
    $(BINDIR)/regex.jar.o \
    $(BINDIR)/queries.jar.o \
    $(STORE_O) \
    $(BINDIR)/io.java.o \
    $(BINDIR)/store.java.o \
    $(BINDIR)/search.java.o \
    $(BINDIR)/queryParser.java.o \
    $(BINDIR)/analysis.java.o \
    $(BINDIR)/util.java.o \
    $(BINDIR)/highlight.java.o
	cd $(CLASSES); \
	find . -name '*.class' -print | \
	sed -e 's|^\./||' -e 's|/|.|g' -e 's|\.class$$||' | \
	xargs -n 1 $(JCCH) -d . --classpath=.

ifeq ($(OS),Cygwin)
DEFINES:=$(DEFINES) -D_NO_OLDNAMES -D_off_t=off_t
else
ifeq ($(GCJ_STATIC),1)
DEFINES:=$(DEFINES) -DGCJ_STATIC
endif
endif

CPP_OBJS=$(BINDIR)/functions.o $(BINDIR)/converters.o $(BINDIR)/java.o \
         $(BINDIR)/lucene.o $(BINDIR)/_PyLucene.o

$(CPP_OBJS): $(BINDIR)/%.o: %.cpp
	$(CXX) -c -o $@ $(CCFLAGS) $(PYDBG) $(DEFINES) $(DB_INC) $(PYLUCENE_INC) $(CC_INC) $<


ifeq ($(OS),Darwin)
ifneq (,$(findstring 10.3,$(shell sw_vers -productVersion)))
STUBS=
else
STUBS=-lSystemStubs
endif

$(PYLUCENE_LIB): $(JAVA_OBJS) $(CPP_OBJS)
ifeq ($(GCJ_STATIC),1)
	ld -dynamic -bundle -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) /usr/lib/bundle1.o -L$(GCJ_LIBDIR) -framework System -bundle_loader $(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)/bin/python$(_SUFFIX) -F$(PREFIX_FRAMEWORKS) -framework Python $(GCJ_LIBDIR)/libgcj.a -lgcc_s$(LIBGCC_S_VER) -liconv -lstdc++ $(STUBS) -multiply_defined suppress
else
	ld -dynamic -bundle -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) /usr/lib/bundle1.o -L$(GCJ_LIBDIR) -framework System -bundle_loader $(PREFIX_FRAMEWORKS)/Python.framework/Versions/$(PYTHON_VER)/bin/python$(_SUFFIX) -F$(PREFIX_FRAMEWORKS) -framework Python -lgcj -lgcc_s$(LIBGCC_S_VER) -liconv -lstdc++ $(STUBS) -multiply_defined suppress
endif
ifneq ($(DEBUG),1)
	$(STRIP) $@
endif
else

ifeq ($(OS),Linux)
$(PYLUCENE_LIB): $(JAVA_OBJS) $(CPP_OBJS)
ifeq ($(GCJ_STATIC),1)
	$(CXX) -shared -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) -L$(GCJ_LIBDIR) $(GCJ_LIBDIR)/libgcj.a
else
	$(CXX) -shared -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) -L$(GCJ_LIBDIR) -lgcj
endif
ifneq ($(DEBUG),1)
	$(STRIP) $@
endif
else

ifeq ($(OS),FreeBSD)
$(PYLUCENE_LIB): $(JAVA_OBJS) $(CPP_OBJS)
	$(CXX) -shared -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) -L$(GCJ_LIBDIR) -lgcj -liconv -lz
else

ifeq ($(OS),Cygwin)
$(PYLUCENE_LIB): $(JAVA_OBJS) $(CPP_OBJS)
	$(CXX) -shared -o $@ $(LDFLAGS) $(JAVA_OBJS) $(CPP_OBJS) `cygpath -aw $(PREFIX_PYTHON)/python$(subst .,,$(PYTHON_VER))$(_SUFFIX).dll` -L`cygpath -aw $(GCJ_LIBDIR)` -lgcj -liconv -lwin32k -lws2_32
ifneq ($(DEBUG),1)
	$(dir $(CXX))$(STRIP) $@
endif
endif
endif
endif
endif


all: env sources $(BINDIR) $(LIBS)
	@echo build of $(PYLUCENE_LIB) complete

install:: all
	mkdir -p $(PYTHON_SITE)
	install -m 644 PyLucene.py $(PYTHON_SITE)
	install $(PYLUCENE_LIB) $(PYTHON_SITE)
	mkdir -p $(PYTHON_SITE)/security
	install -m 644 $(GCJ_LIBDIR)/security/classpath.security $(PYTHON_SITE)/security
	install -m 644 $(GCJ_LIBDIR)/security/libgcj.security $(PYTHON_SITE)/security

ifneq ($(LIB_INSTALL),)
install::
	for lib in $(LIB_INSTALL); do \
            install $(GCJ_LIBDIR)/$$lib $(PREFIX)/lib; \
        done
ifneq ($(DEBUG),1)
	for lib in $(LIB_INSTALL); do \
            $(STRIP) $(PREFIX)/lib/$$lib; \
        done
endif
endif

ifeq ($(OS),Darwin)
ifdef DB
install::
	mkdir -p $(PREFIX_DB)/lib
	install $(LIBDB_JAVA_LIB) $(PREFIX_DB)/lib
	install libdb_java-$(DB_LIB_VER).la.osx $(PREFIX_DB)/lib/libdb_java-$(DB_LIB_VER).la
endif
else

ifeq ($(OS),Linux)
install::
ifdef DB
	mkdir -p $(PREFIX_DB)/lib
	install $(LIBDB_JAVA_LIB) $(PREFIX_DB)/lib
endif
else

ifeq ($(OS),FreeBSD)
install::
ifdef DB
	mkdir -p $(PREFIX_DB)/lib
	install $(LIBDB_JAVA_LIB) $(PREFIX_DB)/lib
endif
else

ifeq ($(OS),Cygwin)
install::
	install $(GCJ_HOME)/bin/libiconv-2.dll $(PYTHON_SITE)
ifdef DB
	install $(LIBDB_JAVA_LIB) $(PREFIX_DB)/build_win32/$(BINDIR)
endif
endif
endif
endif
endif

clean:
	if test -f $(LUCENE)/build.xml; then cd $(LUCENE); ant clean; fi
	rm -rf $(BINDIR)

realclean: clean
	rm -rf $(LUCENE) $(DISTRIB) $(DISTRIB_SRC)

distrib::
	mkdir -p $(DISTRIB)/python
	install PyLucene.py $(DISTRIB)/python
	install $(PYLUCENE_LIB) $(DISTRIB)/python
	install README $(DISTRIB)
	mkdir -p $(DISTRIB)/python/security
	install $(GCJ_LIBDIR)/security/classpath.security $(DISTRIB)/python/security
	install $(GCJ_LIBDIR)/security/libgcj.security $(DISTRIB)/python/security

ifneq ($(LIB_INSTALL),)
distrib::
	mkdir $(DISTRIB)/gcj
	for lib in $(LIB_INSTALL); do \
            install $(GCJ_LIBDIR)/$$lib $(DISTRIB)/gcj; \
        done
ifneq ($(DEBUG),1)
	for lib in $(LIB_INSTALL); do \
            $(STRIP) $(DISTRIB)/gcj/$$lib; \
        done
endif
endif

ifeq ($(OS),Darwin)
distrib::
ifdef DB
	mkdir -p $(DISTRIB)/db
	install $(LIBDB_JAVA_LIB) $(DISTRIB)/db
	install libdb_java-$(DB_LIB_VER).la.osx $(DISTRIB)/db
endif
else

ifeq ($(OS),Linux)
distrib::
ifdef DB
	mkdir -p $(DISTRIB)/db
	install $(LIBDB_JAVA_LIB) $(DISTRIB)/db
endif
else

ifeq ($(OS),FreeBSD)
distrib::
ifdef DB
	mkdir -p $(DISTRIB)/db
	install $(LIBDB_JAVA_LIB) $(DISTRIB)/db
endif
else

ifeq ($(OS),Cygwin)
distrib::
	install $(GCJ_HOME)/bin/libiconv-2.dll $(DISTRIB)/python
ifdef DB
	mkdir -p $(DISTRIB)/db
	install $(LIBDB_JAVA_LIB) $(DISTRIB)/db
endif
endif
endif
endif
endif

samples/LuceneInAction/index:
	cd samples/LuceneInAction; $(PYTHON) index.py

test: samples/LuceneInAction/index
	find test -name 'test_*.py' | xargs -n 1 $(PYTHON)
	ls samples/LuceneInAction/*Test.py | xargs -n 1 $(PYTHON)

distrib::
	tar --exclude .svn \
            --exclude index \
            --exclude indexes \
            --exclude '*.py?' \
            -cf - samples test/*.py | tar -C $(DISTRIB) -xf -
	install CHANGES $(DISTRIB)
	install CREDITS $(DISTRIB)
	tar -C distrib -cvzf $(DISTRIB).tar.gz $(notdir $(DISTRIB))

distrib-src:
	mkdir -p $(DISTRIB)
	svn export . $(DISTRIB_SRC)
	tar --exclude '*.class' \
            -cf - $(LUCENE)/build $(LUCENE)/contrib/db/bdb/lib | tar -C $(DISTRIB_SRC) -xf -
	find $(DISTRIB_SRC) -name '*.jar' | xargs touch -m
	tar -C distrib -cvzf $(DISTRIB_SRC).tar.gz $(notdir $(DISTRIB_SRC))
