From 0561f2e37027845466dff409822506c122ccae9c Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Fri, 28 Mar 2008 19:25:16 +0000 Subject: [PATCH] Added GEOS_VERNUM macro and protected GEOS 3.0/3.1 functionality behind it. git-svn-id: http://svn.osgeo.org/postgis/trunk@2743 b70326c6-7e19-0410-871a-916f4a2858ee --- ChangeLog | 10 +++++++++ Makefile.config.in | 40 ++++++++---------------------------- configure.in | 45 +++++++++++------------------------------ lwgeom/Makefile | 1 + lwgeom/lwgeom_geos_c.c | 6 ++++-- lwgeom/lwpostgis.sql.in | 41 ++++++++++++++++++++++--------------- 6 files changed, 60 insertions(+), 83 deletions(-) diff --git a/ChangeLog b/ChangeLog index e2a404873..3bf33bd43 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,13 @@ +2008-03-28 Paul Ramsey + + * Makefile.config.in, configure.in, lwgeom/Makefile, + lwgeom/lwpostgis.sql.in, lwgeom/lwgeom_geos_c.c + Changed GEOS version checking to use geos-config, and + set a GEOS_VERNUM macro that compresses the version string + into an integer: 2.2.1 = 22, 3.1.1 = 31, etc. + * Placed GEOS 3.0 and 3.1 dependent functions into + appropriate macro blocks. + 2008-02-12 Paul Ramsey * lwgeom/lwgeom_geos_c.c, lwgeom/lwpostgis.sql.in: Add in hook to diff --git a/Makefile.config.in b/Makefile.config.in index 0a27f8b36..c052e09a5 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -36,6 +36,7 @@ PROJ_LIBDIR=@PROJ_LIBDIR@ USE_GEOS=@USE_GEOS@ GEOS_DIR=@GEOS_DIR@ GEOS_LDFLAGS=@GEOS_LDFLAGS@ +GEOS_VERNUM=@GEOS_VERNUM@ # # Set USE_JTS to 1 if you have libjts installed. @@ -156,36 +157,11 @@ endif #--------------------------------------------------------------- # Test the version string and set the USE_VERSION macro -# appropriately. -# -VERSION=$(shell $(PGCONFIG) --version) -ifneq ($(findstring 7.1,$(VERSION)),) - USE_VERSION=71 -else - ifneq ($(findstring 7.2,$(VERSION)),) - USE_VERSION=72 - else - ifneq ($(findstring 7.3,$(VERSION)),) - USE_VERSION=73 - else - ifneq ($(findstring 7.4,$(VERSION)),) - USE_VERSION=74 - else - ifneq ($(findstring 8.0,$(VERSION)),) - USE_VERSION=80 - else - ifneq ($(findstring 8.1,$(VERSION)),) - USE_VERSION=81 - else - ifneq ($(findstring 8.2,$(VERSION)),) - USE_VERSION=82 - else - USE_VERSION=83 - endif - endif - endif - endif - endif - endif -endif +# appropriately. eg: +# +# pg_config --version => PostgreSQL 8.3.1 +# +PG_VERSION_MAJOR=$(shell $(PGCONFIG) --version | cut -f2 -d' ' | cut -f1 -d.) +PG_VERSION_MINOR=$(shell $(PGCONFIG) --version | cut -f2 -d' ' | cut -f2 -d.) +USE_VERSION=$(PG_VERSION_MAJOR)$(PG_VERSION_MINOR) diff --git a/configure.in b/configure.in index 4b90dba5f..d76581595 100644 --- a/configure.in +++ b/configure.in @@ -117,9 +117,11 @@ dnl AC_SUBST(USE_GEOS) AC_SUBST(GEOS_DIR) AC_SUBST(GEOS_LDFLAGS) +AC_SUBST(GEOS_VERNUM) USE_GEOS=0 GEOS_DIR= GEOS_LDFLAGS= +GEOS_VERNUM=10 AC_PATH_PROG([GEOSCONFIG], [geos-config]) if test -n "$GEOSCONFIG"; then @@ -145,9 +147,10 @@ AC_ARG_WITH(geos, ) if test $USE_GEOS -gt 0; then - GEOS_DIR=`$GEOSCONFIG --prefix` + GEOS_DIR=`$GEOSCONFIG --prefix` GEOS_LDFLAGS=`$GEOSCONFIG --ldflags 2> /dev/null` + if test x"$GEOS_LDFLAGS" = "x"; then # older geos-config versions did not # support the --ldflags switch, we'll @@ -157,42 +160,18 @@ if test $USE_GEOS -gt 0; then fi GEOS_MAJOR=`$GEOSCONFIG --version | cut -d. -f1` - if test "$GEOS_MAJOR" = "@GEOS_VERSION@"; then - GEOS_MAJOR=1 - GEOS_MINOR=0 - else - GEOS_MINOR=`$GEOSCONFIG --version | cut -d. -f2` + GEOS_MINOR=`$GEOSCONFIG --version | cut -d. -f2` + GEOS_VERNUM=`expr $GEOS_MAJOR "*" 10` + GEOS_VERNUM=`expr $GEOS_VERNUM "+" $GEOS_MINOR` + + # GEOS >= 3.0.0 always has CAPI, however only GEOS >= 2.2.0 has CAPI support + # so abort if CAPI support is not available. + if test $GEOS_VERNUM -lt 22; then + AC_MSG_ERROR([PostGIS version >= 1.2.0 requires GEOS version >= 2.2.0]) fi - # GEOS >= 3.0.0 always has CAPI, however only GEOS >= 2.2.0 has CAPI support - # so abort if CAPI support is not available. - if test $GEOS_MAJOR -lt 3; then - if test $GEOS_MAJOR -eq 2 -a $GEOS_MINOR -lt 2; then - AC_MSG_ERROR([PostGIS version >= 1.2.0 requires GEOS version >= 2.2.0]) - else - # Make sure we abort for all other versions of GEOS - if test $GEOS_MAJOR -lt 2; then - AC_MSG_ERROR([PostGIS version >= 1.2.0 requires GEOS version >= 2.2.0]) - fi - fi - fi fi -AC_ARG_WITH(geos-libdir, -[ --with-geos-libdir=PATH path to GEOS libdir - [[taken from geos-config by default]]], -[ -case "$with_geos_libdir" in - no|yes) - AC_MSG_ERROR([Invalid argument to --with-geos-libdir]) - ;; - *) - GEOS_LDFLAGS=-L${with_geos_libdir} - ;; -esac -], with_geos_libdir=no) - - AC_SUBST(USE_PROJ) AC_SUBST(PROJ_DIR) AC_SUBST(PROJ_LIBDIR) diff --git a/lwgeom/Makefile b/lwgeom/Makefile index 946611a04..5aa7a5c10 100644 --- a/lwgeom/Makefile +++ b/lwgeom/Makefile @@ -38,6 +38,7 @@ override CFLAGS += -DPOSTGIS_BUILD_DATE='"$(POSTGIS_BUILD_DATE)"' JTS_OBJ=lwgeom_nojts.o ifeq ($(USE_GEOS),1) CSTAR_FLAGS += -DUSE_GEOS + CSTAR_FLAGS += -DGEOS_VERNUM=$(GEOS_VERNUM) GEOS_RULES= CSTAR_FLAGS += -I$(GEOS_DIR)/include GEOS_WRAPPER= diff --git a/lwgeom/lwgeom_geos_c.c b/lwgeom/lwgeom_geos_c.c index 68d677ed1..8b85bff2d 100644 --- a/lwgeom/lwgeom_geos_c.c +++ b/lwgeom/lwgeom_geos_c.c @@ -752,6 +752,8 @@ Datum convexhull(PG_FUNCTION_ARGS) } +#if GEOS_VERNUM >= 30 + PG_FUNCTION_INFO_V1(topologypreservesimplify); Datum topologypreservesimplify(PG_FUNCTION_ARGS) { @@ -828,6 +830,7 @@ Datum topologypreservesimplify(PG_FUNCTION_ARGS) PG_RETURN_POINTER(result); } +#endif PG_FUNCTION_INFO_V1(buffer); Datum buffer(PG_FUNCTION_ARGS) @@ -3673,8 +3676,7 @@ Datum intersectsPrepared(PG_FUNCTION_ARGS); /* * GEOS prepared geometry is only available from GEOS 3.1 onwards */ -#if ( GEOS_VERSION_MAJOR > 3 || (GEOS_VERSION_MAJOR == 3 && GEOS_VERSION_MINOR >= 1) ) -/* #if ( GEOS_CAPI_VERSION_MAJOR > 1 || (GEOS_CAPI_VERSION_MAJOR == 1 && GEOS_CAPI_VERSION_MINOR >= 5) ) */ +#if GEOS_VERNUM >= 31 #define PREPARED_GEOM 1 #endif diff --git a/lwgeom/lwpostgis.sql.in b/lwgeom/lwpostgis.sql.in index 0f0f56971..6aedc91bd 100644 --- a/lwgeom/lwpostgis.sql.in +++ b/lwgeom/lwpostgis.sql.in @@ -4073,13 +4073,13 @@ CREATE CAST (geometry AS bytea) WITH FUNCTION ST_bytea(geometry) AS IMPLICIT; --------------------------------------------------------------- -- Deprecation in 1.2.3 -CREATEFUNCTION simplify(geometry, float8) +CREATEFUNCTION Simplify(geometry, float8) RETURNS geometry AS '@MODULE_FILENAME@', 'LWGEOM_simplify2d' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); -- Availability: 1.2.2 -CREATEFUNCTION ST_simplify(geometry, float8) +CREATEFUNCTION ST_Simplify(geometry, float8) RETURNS geometry AS '@MODULE_FILENAME@', 'LWGEOM_simplify2d' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); @@ -4137,13 +4137,13 @@ CREATEFUNCTION ST_SnapToGrid(geometry, geometry, float8, float8, float8, float8) LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); -- Deprecation in 1.2.3 -CREATEFUNCTION segmentize(geometry, float8) +CREATEFUNCTION Segmentize(geometry, float8) RETURNS geometry AS '@MODULE_FILENAME@', 'LWGEOM_segmentize2d' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); -- Availability: 1.2.2 -CREATEFUNCTION ST_segmentize(geometry, float8) +CREATEFUNCTION ST_Segmentize(geometry, float8) RETURNS geometry AS '@MODULE_FILENAME@', 'LWGEOM_segmentize2d' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); @@ -4264,11 +4264,14 @@ CREATEFUNCTION ST_ConvexHull(geometry) AS '@MODULE_FILENAME@','convexhull' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); +#if GEOS_VERNUM >= 30 +-- Requires GEOS >= 3.0.0 -- Availability: 1.3.3 CREATEFUNCTION ST_SimplifyPreserveTopology(geometry, float8) RETURNS geometry AS '@MODULE_FILENAME@','topologypreservesimplify' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); +#endif -- Deprecation in 1.2.3 CREATEFUNCTION difference(geometry,geometry) @@ -4490,7 +4493,7 @@ CREATEFUNCTION ST_Within(geometry,geometry) LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); -- Deprecation in 1.2.3 -CREATEFUNCTION contains(geometry,geometry) +CREATEFUNCTION Contains(geometry,geometry) RETURNS boolean AS '@MODULE_FILENAME@' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); @@ -4508,6 +4511,7 @@ CREATEFUNCTION ST_Contains(geometry,geometry) AS 'SELECT $1 && $2 AND _ST_Contains($1,$2)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); +#if GEOS_VERNUM >= 30 -- Availability: 1.2.2 CREATEFUNCTION _ST_CoveredBy(geometry,geometry) RETURNS boolean @@ -4532,6 +4536,7 @@ CREATEFUNCTION ST_Covers(geometry,geometry) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_Covers($1,$2)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); +#endif -- Deprecation in 1.2.3 CREATEFUNCTION overlaps(geometry,geometry) @@ -4642,65 +4647,69 @@ CREATEFUNCTION ST_Equals(geometry,geometry) -- requires GEOS 3.1.0-CAPI-1.5.0 or better ----------------------------------------------------------------------- +#if GEOS_VERNUM >= 31 + +-- Availability: 1.4.0 CREATEFUNCTION _ST_ContainsPrepared(geometry,geometry,integer) RETURNS boolean AS '@MODULE_FILENAME@','containsPrepared' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); --- Availability: 1.3.3 +-- Availability: 1.4.0 -- Inlines index magic CREATEFUNCTION ST_Contains(geometry,geometry,integer) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_ContainsPrepared($1,$2,$3)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); - +-- Availability: 1.4.0 CREATEFUNCTION _ST_ContainsProperlyPrepared(geometry,geometry,integer) RETURNS boolean AS '@MODULE_FILENAME@','containsProperlyPrepared' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); --- Availability: 1.3.3 +-- Availability: 1.4.0 -- Inlines index magic CREATEFUNCTION ST_ContainsProperly(geometry,geometry,integer) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_ContainsProperlyPrepared($1,$2,$3)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); - --- Availability: 1.3.3 +-- Availability: 1.4.0 -- Added for completeness, and to make testing ST_ContainsProperlyPrepared easier CREATE OR REPLACE FUNCTION ST_ContainsProperly(geometry,geometry) RETURNS boolean AS 'SELECT $1 && $2 AND ST_relate($1,$2,''T**FF*FF*'')' LANGUAGE 'SQL' IMMUTABLE; - +-- Availability: 1.4.0 CREATEFUNCTION _ST_CoversPrepared(geometry,geometry,integer) RETURNS boolean AS '@MODULE_FILENAME@','coversPrepared' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); - --- Availability: 1.3.3 + +-- Availability: 1.4.0 -- Inlines index magic CREATEFUNCTION ST_Covers(geometry,geometry,integer) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_CoversPrepared($1,$2,$3)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); - +Availability: 1.4.0 CREATEFUNCTION _ST_IntersectsPrepared(geometry,geometry,integer) RETURNS boolean AS '@MODULE_FILENAME@','intersectsPrepared' LANGUAGE 'C' _IMMUTABLE_STRICT; -- WITH (isstrict,iscachable); - --- Availability: 1.3.3 + +-- Availability: 1.4.0 -- Inlines index magic CREATEFUNCTION ST_Intersects(geometry,geometry,integer) RETURNS boolean AS 'SELECT $1 && $2 AND _ST_IntersectsPrepared($1,$2,$3)' LANGUAGE 'SQL' _IMMUTABLE; -- WITH (iscachable); +#endif + ----------------------------------------------------------------------- -- SVG OUTPUT ----------------------------------------------------------------------- -- 2.49.0