# PostGIS Makefile

# (C) 2004 Paul Ramsey, pramsey@refractions.net
# (C) 2005 Markus Schaber, markus.schaber@logix-tt.com
# (C) 2005 Sandro Santilli, strk@refractions.net
# (C) 2005 Alex Bodnaru, alexbodn@012.net.il

#    This program is free software; you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation; either version 2 of the License, or
#    (at your option) any later version.

#    This program 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 General Public License for more details.

#    You should have received a copy of the GNU General Public License
#    along with this program; if not, write to the Free Software
#    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA

# Following are some variable definitions that may have to be changed
# according to your build environment. This can be done either by editing
# this Makefile, or setting them via shell environment prior to calling make.

### Config variable section starts ###

# Configure the helper executables used during build.

JAVAC?=javac -target 1.2 -source 1.2
JAVA?=java
JAR?=jar
MKDIR?=mkdir -p
DELETE?=rm -rvf
CP?=cp

# If you happen to be stuck with ancient jar implementations that do not
# know about the -u option, but does not complain about duplicate directorys
# with the same name (e. G. debian woody fastjar), set the DEBUGJAR below
# variable to postgis_debug.fastjar and JAR (above) to fastjar.
DEBUGJAR?=postgis_debug.jar

# Make sure our classpath includes your postgresql.jar. This is somehow
# difficult because some JREs (e. G. those on debian woody or sablevm) seem
# to forget their own system classes (aka bootclasspath) as soon as _any_
# classpath is set, either via environment or via command line. They do not
# implement the concept of distinct classpath and bootclasspath settings,
# as most current java implementations do. This makes it necessary to either
# explicitly include the system classes in the set classpath, or use
# non-standard options line --addclasspath to add both the postgresql.jar
# and our own classes. We also cannot set an unset CLASSPATH variable here
# for this reason. Current (Jan 2005) implementations from SUN, IBM, 
# Blackdown, gij and kaffe are known to work fine.

# If you set POSTGIS_BUILD_CLASSPATH via Environment (even to an empty string), we
# simply use it and do not try to guess anything. If POSTGIS_CLASSPATH is
# not set, we use the contents of CLASSPATH. If CLASSPATH is empty or not
# set, we try to guess a default location that works on most unixoid systems.

ifeq (${CLASSPATH},)
	POSTGIS_BUILD_CLASSPATH?=/usr/share/java/postgresql.jar
else
	POSTGIS_BUILD_CLASSPATH?=${CLASSPATH}
endif

# Set those to --addclasspath for sablevm, to avoid overriding the
# BOOTCLASSPATH, the first one is for the compiler, the second one for JRE.
COMP_ADDCP?=-classpath
EXEC_ADDCP?=-classpath

# Class path entry separator, this is : on Linux/Unix and ; on Windows
CPSEP?=:

# This are used for the online regression tests, override via environment
# as applicable. The jtest needs table creation privilege in current_schema(),
# the others only call self contained SELECTs that do not access any tables.
PGHOST?=localhost
PGPORT?=5432
PGDATABASE?=jdbc_test
PGUSER?=psql
PGPASS?=guess
PGURL?=//$(PGHOST):$(PGPORT)/$(PGDATABASE)

# Where to put the output from regression tests. If you want to have it on
# stdout, set TESTRD to the empty string. If you want to have it in another
# file, set TESTOUTPUT to the file path.
# Be careful - that file will be deleted by "make clean".
TESTOUTPUT?=test.log
# Output redirect for tests
TESTRD?= >>$(TESTOUTPUT) 

### Config variable section ends ###

# build internal constants follow:
SRCDIR=./src
EXAMPLES=examples
BUILD=./bin
RUNCP=$(POSTGIS_BUILD_CLASSPATH)$(CPSEP)./postgis.jar
BUILDCP=$(STUBBUILD)$(CPSEP)$(POSTGIS_BUILD_CLASSPATH)$(CPSEP)$(SRCDIR)

# The pgjdbc 7.2/7.4/8.0 compatibility stub stuff
STUBDIR=stubs
STUBBUILD=./stubbin/

# What to put into the JAR files:
JARCONTENTS=-C $(BUILD) org \
		-C $(BUILD) examples \
		-C $(SRCDIR) org/postgresql/driverconfig.properties \
		-C . README COPYING_LGPL \
		-C ../.. COPYING

DEBUGJARCONTENTS=-C $(SRCDIR) org \
		-C $(SRCDIR) examples

# include version numbers
include ../../Version.config

# include configuration from central repository, only needed for install
# and installdirs targets, not for building itsself.
-include ../../Makefile.config

VERSION=$(POSTGIS_MAJOR_VERSION).$(POSTGIS_MINOR_VERSION).$(POSTGIS_MICRO_VERSION)

# We copy the ../Version.config into the jar to have it read at runtime.
VERSIONPATH=$(BUILD)/org/postgis
VERSIONTARGET=$(VERSIONPATH)/version.properties


# Preliminary jts support - not stable yet!
JTSDIR=jtssrc
JTSBUILD=jtsbin/

JTSPATH=$(JTSBUILD)$(CPSEP)$(BUILD)$(CPSEP)$(RUNCP)

# Get the list of all source files

SRC = $(SRCDIR)/org/postgis/*.java $(SRCDIR)/org/postgis/*/*.java $(SRCDIR)/examples/*.java

STUBSRC = $(STUBDIR)/org/postgresql/*.java

JTSSRC = $(JTSDIR)/org/postgis/jts/*.java $(JTSDIR)/examples/*.java


# Now the makefile targets that do the work:
# The default target:
all:	deprecation-warning \
	jar \
		postgis-jdbc-javadoc.zip \
	offlinetests

# This Makefile is deprecated for build.xml (build with Ant)
deprecation-warning:
	@echo "***"
	@echo "*** WARNING: This Makefile is deprecated for a build using Ant (build.xml)"
	@echo "***"
	@echo "*** If you wish to build a standard PostGIS JDBC driver, please use the Ant build"
	@echo "*** If you wish to build a JTS-enabled PostGIS JDBC driver, or run the online"
	@echo "*** regression tests, you will currently still need to use this Makefile"
	@echo "***"

# Packing the archives

jar:	compile postgis.jar $(DEBUGJAR)
	$(CP) postgis.jar postgis_$(VERSION).jar
	$(CP) postgis_debug.jar postgis_debug_$(VERSION).jar

postgis.jar: compile $(SRCDIR)/org/postgresql/driverconfig.properties
	$(JAR) -cf postgis.jar $(JARCONTENTS)

postgis_debug.jar: postgis.jar $(SRC)
	$(CP) postgis.jar postgis_debug.jar
	$(JAR) -uf postgis_debug.jar $(DEBUGJARCONTENTS)

# See comment for DEBUGJAR above for this rule.
postgis_debug.fastjar: compile $(SRC) $(SRCDIR)/org/postgresql/driverconfig.properties
	$(JAR) -cf postgis_debug.jar $(JARCONTENTS) $(DEBUGJARCONTENTS)

$(BUILD):
	$(MKDIR) $(BUILD)

$(STUBBUILD):
	$(MKDIR) $(STUBBUILD)

$(VERSIONPATH): $(BUILD)
	$(MKDIR) $(VERSIONPATH)

$(VERSIONTARGET): $(SRC) ../../Version.config $(VERSIONPATH)
	$(CP) ../../Version.config $(VERSIONTARGET)

stubcompile: $(STUBBUILD) $(SRCCONF) $(STUBSRC)
	$(JAVAC) -d $(STUBBUILD) $(STUBSRC)
	touch stubcompile

compile: stubcompile $(BUILD) $(SRCCONF) $(SRC) $(VERSIONTARGET)
	$(JAVAC) $(COMP_ADDCP) "$(BUILDCP)" -d $(BUILD) $(SRC) 
	touch compile

test:	postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/Test $(TESTRD) 

jtest:	postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestServer $(TESTRD) \
	 jdbc:postgresql:$(PGURL) $(PGUSER) $(PGPASS)

ptestoffline: postgis.jar	
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestParser $(TESTRD) offline

ptest: postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestParser $(TESTRD) \
	 "jdbc:postgresql_postGIS:$(PGURL);jdbc:postgresql_autogis:$(PGURL)" \
	 $(PGUSER) $(PGPASS)

boxtestoffline: postgis.jar	
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestBoxes $(TESTRD) offline

boxtest: postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestBoxes $(TESTRD) \
	 jdbc:postgresql_postGIS:$(PGURL) $(PGUSER) $(PGPASS)

autoregistertest: postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/TestAutoregister $(TESTRD) \
	 jdbc:postgresql:$(PGURL) $(PGUSER) $(PGPASS)

# Print all available versions
versions: postgis.jar
	$(JAVA) $(EXEC_ADDCP) "$(RUNCP)" $(EXAMPLES)/VersionPrinter jdbc:postgresql://$(PGHOST):$(PGPORT)/$(PGDATABASE) $(PGUSER) $(PGPASS)

offlinetests: boxtestoffline ptestoffline test

onlinetests: boxtest ptest jtest autoregistertest

# boxtest and ptest include boxtestoffline and ptestoffline, so we only need
# to run test in addition to the onlinetests
alltests: onlinetests test

# Cleaning
clean:
	echo cleaning...
	$(DELETE) $(BUILD) bin stubbin postgis.jar postgis_debug.jar \
		compile stubcompile jtscompile $(JTSBUILD) postgis_jts.jar \
		javadoc-build postgis-jdbc-javadoc.zip \
		$(TESTOUTPUT) \
		postgis_$(VERSION).jar \
		postgis_debug_$(VERSION).jar \
		postgis_jts_$(VERSION).jar

maintainer-clean: clean
	$(DELETE) $(SRCCONF)


install: jar installdirs
	@echo Testing for successful inclusion of ../Makefile.config
	test ../Makefile.config
	$(INSTALL_DATA) postgis.jar $(DESTDIR)
	$(INSTALL_DATA) postgis_debug.jar $(DESTDIR)

installdirs:
	@mkdir -p $(DESTDIR)

postgis-jdbc-javadoc.zip: javadoc-build
	$(JAR) -cf postgis-jdbc-javadoc.zip -C javadoc-build .

javadoc-build:
	$(MKDIR) javadoc-build
	# We use an ugly trick to build on windows and unix - 
	# javadoc command line options are not portable wr/t path separators
	javadoc -d javadoc-build -sourcepath "src:jtssrc:;src;jtssrc" \
		org.postgis org.postgis.jts org.postgis.binary org.postgis.java2d examples

# Preliminary JTS support

postgis_jts: postgis_jts.jar jtstestoffline
	@echo "Warning! This is beta code. Use at your own risk."

$(JTSBUILD):
	$(MKDIR) $(JTSBUILD)

jtscompile: compile stubcompile $(JTSBUILD) $(SRCCONF) $(JTSSRC)
	$(JAVAC) $(COMP_ADDCP) "$(BUILD)$(CPSEP)$(BUILDCP)" -d $(JTSBUILD) $(JTSSRC) 
	touch jtscompile
	
jtstestoffline: jtscompile	
	$(JAVA) $(EXEC_ADDCP) "$(JTSPATH)" $(EXAMPLES)/JtsTestParser $(TESTRD) offline

jtstest: jtscompile
	$(JAVA) $(EXEC_ADDCP) "$(JTSPATH)" $(EXAMPLES)/JtsTestParser $(TESTRD) \
	jdbc:postgres_jts:$(PGURL) $(PGUSER) $(PGPASS)

postgis_jts.jar: postgis.jar jtscompile $(SRCDIR)/org/postgresql/driverconfig.properties
	$(CP) postgis.jar postgis_jts.jar
	$(JAR) -uf postgis_jts.jar -C $(JTSBUILD) .
	$(CP) postgis_jts.jar postgis_jts_$(VERSION).jar

