From 24086ebcb7ea7043abd2d006397d3583fb67d601 Mon Sep 17 00:00:00 2001 From: Paul Ramsey Date: Wed, 14 Aug 2019 22:13:55 +0000 Subject: [PATCH] Improve libprotobuf detection for old systems References #4481 git-svn-id: http://svn.osgeo.org/postgis/branches/2.5@17712 b70326c6-7e19-0410-871a-916f4a2858ee --- NEWS | 1 + configure.ac | 150 +++++++++++++++++----------------- postgis/Makefile.in | 4 +- postgis/postgis_libprotobuf.c | 6 +- postgis_config.h.in | 6 ++ regress/Makefile.in | 4 +- 6 files changed, 88 insertions(+), 83 deletions(-) diff --git a/NEWS b/NEWS index 912b8bf80..c7c2792dd 100644 --- a/NEWS +++ b/NEWS @@ -21,6 +21,7 @@ PostGIS 2.5.3 - #4470, ST_GeomFromGeoJSON crash on empty rings (Darafei Praliaskouski) - #4420, update path does not exists for address_standardizer extension (Regina Obe) - #4480, Geography Distance inconsistent with Intersects (Paul Ramsey) + - #4481, Improve libprotobuf detection for old systems (Paul Ramsey) PostGIS 2.5.2 diff --git a/configure.ac b/configure.ac index 2ed706954..e6ed0e061 100644 --- a/configure.ac +++ b/configure.ac @@ -939,7 +939,7 @@ dnl Detect if protobuf-c installed dnl =========================================================================== CHECK_PROTOBUF=yes -HAVE_PROTOBUF=no +HAVE_PROTOBUF=yes AC_ARG_WITH([protobuf], [AS_HELP_STRING([--without-protobuf], [build without protobuf-c support])], @@ -948,86 +948,84 @@ AC_ARG_WITH([protobuf], dnl User didn't turn off protobuf support so... if test "$CHECK_PROTOBUF" != "no"; then - AC_ARG_WITH([protobufdir], - [AS_HELP_STRING([--with-protobufdir=PATH], [specify the protobuf-c installation directory])], - [PROTOBUFDIR="$withval"], [PROTOBUFDIR=]) - - dnl User specified the directory to find protobuf in, check that and - dnl fail if it doesn't work - if test ! "x$PROTOBUFDIR" = "x"; then - dnl Make sure that the directory exists - if test "x$PROTOBUFDIR" = "xyes"; then - AC_MSG_ERROR([you must specify a parameter to --with-protobufdir, e.g. --with-protobufdir=/path/to]) - else - AC_MSG_RESULT([Using user-specified protobuf-c directory: $PROTOBUFDIR]) - - dnl Add the include directory to PROTOBUF_CPPFLAGS - PROTOBUF_CPPFLAGS="-I$PROTOBUFDIR/include" - PROTOBUF_LDFLAGS="-L$PROTOBUFDIR/lib" - fi - - dnl Check that we can find the protobuf/protobuf.h header file - CPPFLAGS_SAVE="$CPPFLAGS" - CPPFLAGS="$PROTOBUF_CPPFLAGS" - AC_CHECK_HEADER([protobuf-c/protobuf-c.h], [], - AC_MSG_ERROR([unable to find $PROTOBUFDIR/include/protobuf-c/protobuf-c.h]) - ) - CPPFLAGS="$CPPFLAGS_SAVE" - - dnl Ensure we can link against libprotobuf-c - LIBS_SAVE="$LIBS" - LIBS="$PROTOBUF_LDFLAGS" - AC_CHECK_LIB([protobuf-c], [protobuf_c_message_check], [], - AC_MSG_ERROR([unable to link protobuf-c from $PROTOBUFDIR/lib]) - ) - HAVE_PROTOBUF=yes - PROTOBUF_LDFLAGS="-L$PROTOBUFDIR/lib -lprotobuf-c" - LIBS="$LIBS_SAVE" - - dnl No user-specified protobuf dir, try to find one using pkg-config - else - if test -z "$PKG_CONFIG"; then - AC_MSG_WARN([Cannot find pkg-config, disabling protobuf support.]) - HAVE_PROTOBUF=no - else - dnl Ensure libprotobuf-c is of minimum required version - PKG_CHECK_MODULES([PROTOBUFC], [libprotobuf-c], [ - HAVE_PROTOBUF=yes; - PROTOBUF_CPPFLAGS=$PROTOBUFC_CFLAGS; - PROTOBUF_LDFLAGS=$PROTOBUFC_LIBS - ], - [HAVE_PROTOBUF=no]) - fi - fi + dnl Need to find libdir, incdir and protoc-c compiler - if test "$HAVE_PROTOBUF" = "yes"; then - AC_PATH_PROG(PROTOCC, protoc-c) - if test "x$PROTOCC" = "x"; then - AC_MSG_WARN([Protobuf compiler not in path, disabling protobuf support.]) - HAVE_PROTOBUF=no - else - AC_DEFINE([HAVE_LIBPROTOBUF], [1], [Define to 1 if libprotobuf-c is present]) - fi - fi + CPPFLAGS_SAVE="$CPPFLAGS" + LDFLAGS_SAVE="$LDFLAGS" + + dnl Try pkgconfig first + if test -n "$PKG_CONFIG"; then + dnl Ensure libprotobuf-c is of minimum required version + PKG_CHECK_MODULES([PROTOBUFC], [libprotobuf-c >= 1.0.0], [ + PROTOBUF_CPPFLAGS="$PROTOBUFC_CFLAGS"; + PROTOBUF_LDFLAGS="$PROTOBUFC_LIBS"; + ], [ + AC_MSG_RESULT([libprotobuf-c not found in pkg-config]) + ]) + fi + + AC_ARG_WITH([protobufdir], + [AS_HELP_STRING([--with-protobufdir=PATH], [specify the protobuf-c installation directory])],[ + if test "x$withval" = "xyes"; then + AC_MSG_ERROR([you must specify a parameter to --with-protobufdir, e.g. --with-protobufdir=/usr/local]) + else + PROTOBUF_LDFLAGS="-L$withval/lib -lprotobuf-c"; + PROTOBUF_CPPFLAGS="-I$withval/include" + fi + ], []) + + if test -n "$PROTOBUF_CPPFLAGS"; then + CPPFLAGS="$PROTOBUF_CPPFLAGS" + fi - dnl Get version number for protoc-c + if test -n "$PROTOBUF_LDFLAGS"; then + LDFLAGS="$PROTOBUF_LDFLAGS" + fi + + dnl confirm that discovered/configured include path works + AC_CHECK_HEADER([protobuf-c/protobuf-c.h], [], + AC_MSG_RESULT([unable to find protobuf-c/protobuf-c.h using $CPPFLAGS]) + HAVE_PROTOBUF=no + ) + + dnl confirm that discovered/configured library path works + AC_CHECK_LIB([protobuf-c], [protobuf_c_message_init], [], + AC_MSG_RESULT([unable to link protobuf-c using $LDFLAGS]) + HAVE_PROTOBUF=no + ) + + AC_CHECK_LIB([protobuf-c], [protobuf_c_version], + AC_DEFINE([HAVE_PROTOBUF_C_VERSION], [1], [Define to 1 if protobuf_c_version() is present]), + []) + + AC_MSG_CHECKING([protobuf-c version]) + AC_PROTOBUFC_VERSION([PROTOC_VERSION]) + AC_MSG_RESULT([$PROTOC_VERSION]) + + CPPFLAGS="$CPPFLAGS_SAVE" + LDFLAGS="$LDFLAGS_SAVE" + + dnl confirm that protobuf compiler is available + AC_PATH_PROG(PROTOCC, protoc-c) + if test -z "$PROTOCC"; then + AC_MSG_RESULT([Cannot find protoc-c protobuf compiler on the PATH: $PATH]) + HAVE_PROTOBUF=no + fi + + dnl all tests passed! turn on compile-time defines if test "$HAVE_PROTOBUF" = "yes"; then - AC_PATH_PROG(PROTOCC, protoc-c) - PROTOCC_SEMVER=$($PROTOCC --version | grep protobuf-c | awk '{print $2}') - AC_MSG_RESULT([checking protoc-c version... $PROTOCC_SEMVER]) - PROTOCC_VERSION_MAJOR=$(echo "$PROTOCC_SEMVER" | tr '.' ' ' | awk '{print $1}') - PROTOCC_VERSION_MINOR=$(echo "$PROTOCC_SEMVER" | tr '.' ' ' | awk '{print $2}') - PROTOCC_VERSION_PATCH=$(echo "$PROTOCC_SEMVER" | tr '.' ' ' | awk '{print $3}') - PROTOCC_VERSION=$(expr 10000 \* $PROTOCC_VERSION_MAJOR + 100 \* $PROTOCC_VERSION_MINOR + $PROTOCC_VERSION_PATCH) - if test $PROTOCC_VERSION -ge 10100; then - AC_DEFINE([HAVE_GEOBUF], [1], [Define to 1 if libprotobuf-c is >= 1.1]) - fi - fi + AC_DEFINE([HAVE_LIBPROTOBUF], [1], [Define to 1 if libprotobuf-c is present]) + AC_DEFINE_UNQUOTED([LIBPROTOBUF_VERSION], [$PROTOC_VERSION], [Numeric version number for libprotobuf-c]) + if test $PROTOC_VERSION -ge 1001000; then + AC_DEFINE([HAVE_GEOBUF], [1], [Define to 1 if libprotobuf is >= 1.1]) + fi + fi - AC_SUBST([PROTOCC_VERSION]) + AC_SUBST([HAVE_PROTOBUF]) + AC_SUBST([PROTOC_VERSION]) AC_SUBST([PROTOBUF_CPPFLAGS]) AC_SUBST([PROTOBUF_LDFLAGS]) - AC_SUBST([HAVE_PROTOBUF]) + fi @@ -1524,7 +1522,7 @@ AC_MSG_RESULT([ JSON-C support: ${HAVE_JSON}]) AC_MSG_RESULT([ protobuf-c support: ${HAVE_PROTOBUF}]) if test "x$HAVE_PROTOBUF" = "xyes"; then - AC_MSG_RESULT([ protobuf-c version: ${PROTOCC_SEMVER}]) + AC_MSG_RESULT([ protobuf-c version: ${PROTOC_VERSION}]) fi AC_MSG_RESULT([ PCRE support: ${HAVE_PCRE}]) diff --git a/postgis/Makefile.in b/postgis/Makefile.in index fc3afc3dd..36cce5db2 100644 --- a/postgis/Makefile.in +++ b/postgis/Makefile.in @@ -56,7 +56,7 @@ endif ifeq (@HAVE_PROTOBUF@,yes) PROTOBUF_OBJ = vector_tile.pb-c.o -ifeq ($(shell expr @PROTOCC_VERSION@ ">=" 10100),1) +ifeq ($(shell expr @PROTOC_VERSION@ ">=" 1001000),1) PROTOBUF_OBJ += geobuf.pb-c.o endif endif @@ -206,7 +206,7 @@ geobuf.pb-c.c geobuf.pb-c.h: geobuf.proto ifeq (@HAVE_PROTOBUF@,yes) lwgeom_out_mvt.o: vector_tile.pb-c.h mvt.o: vector_tile.pb-c.h -ifeq ($(shell expr $(PROTOCC_VERSION) ">=" 10100),1) +ifeq ($(shell expr $(PROTOC_VERSION) ">=" 1001000),1) lwgeom_out_geobuf.o: geobuf.pb-c.h geobuf.o: geobuf.pb-c.h endif diff --git a/postgis/postgis_libprotobuf.c b/postgis/postgis_libprotobuf.c index 4f3a2ae5b..05466763f 100644 --- a/postgis/postgis_libprotobuf.c +++ b/postgis/postgis_libprotobuf.c @@ -10,11 +10,11 @@ PG_FUNCTION_INFO_V1(postgis_libprotobuf_version); Datum postgis_libprotobuf_version(PG_FUNCTION_ARGS) { -#ifndef HAVE_LIBPROTOBUF +#ifndef HAVE_PROTOBUF_C_VERSION PG_RETURN_NULL(); -#else /* HAVE_LIBPROTOBUF */ +#else /* HAVE_PROTOBUF_C_VERSION */ const char *ver = protobuf_c_version(); text *result = cstring_to_text(ver); PG_RETURN_POINTER(result); #endif -} \ No newline at end of file +} diff --git a/postgis_config.h.in b/postgis_config.h.in index da60dffa5..31597569b 100644 --- a/postgis_config.h.in +++ b/postgis_config.h.in @@ -61,6 +61,12 @@ /* Define to 1 if libprotobuf-c is present */ #undef HAVE_LIBPROTOBUF +/* Define to 1 if protobuf_c_version() is present */ +#undef HAVE_PROTOBUF_C_VERSION + +/* Numeric version number for libprotobuf */ +#undef LIBPROTOBUF_VERSION + /* Define to 1 if libprotobuf-c is >= version 1.1 */ #undef HAVE_GEOBUF diff --git a/regress/Makefile.in b/regress/Makefile.in index d3b808792..521b94093 100644 --- a/regress/Makefile.in +++ b/regress/Makefile.in @@ -23,7 +23,7 @@ POSTGIS_MAJOR_VERSION=@POSTGIS_MAJOR_VERSION@ POSTGIS_MINOR_VERSION=@POSTGIS_MINOR_VERSION@ HAVE_JSON=@HAVE_JSON@ HAVE_PROTOBUF=@HAVE_PROTOBUF@ -PROTOCC_VERSION=@PROTOCC_VERSION@ +PROTOC_VERSION=@PROTOC_VERSION@ HAVE_SFCGAL=@HAVE_SFCGAL@ HAVE_BRIN=@HAVE_BRIN@ HAVE_SPGIST=@HAVE_SPGIST@ @@ -252,7 +252,7 @@ ifeq ($(HAVE_PROTOBUF),yes) # ST_AsMVT, ST_AsGeobuf TESTS += \ mvt -ifeq ($(shell expr $(PROTOCC_VERSION) ">=" 10100),1) +ifeq ($(shell expr $(PROTOC_VERSION) ">=" 1001000),1) TESTS += \ geobuf endif -- 2.40.0