From 4d399a6fbeb720b34d33441330910b7d853f703d Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Sun, 21 Mar 2021 17:20:17 -0400 Subject: [PATCH] Bring configure support for LZ4 up to snuff. It's not okay to just shove the pkg_config results right into our build flags, for a couple different reasons: * This fails to maintain the separation between CPPFLAGS and CFLAGS, as well as that between LDFLAGS and LIBS. (The CPPFLAGS angle is, I believe, the reason for warning messages reported when building with MacPorts' liblz4.) * If pkg_config emits anything other than -I/-D/-L/-l switches, it's highly unlikely that we want to absorb those. That'd be more likely to break the build than do anything helpful. (Even the -D case is questionable; but we're doing that for libxml2, so I kept it.) Also, it's not okay to skip doing an AC_CHECK_LIB probe, as evidenced by recent build failure on topminnow; that should have been caught at configure time. Model fixes for this on configure's libxml2 support. It appears that somebody overlooked an autoheader run, too. Discussion: https://postgr.es/m/20210119190720.GL8560@telsasoft.com --- configure | 64 ++++++++++++++++++++++++++++++++++++-- configure.ac | 18 +++++++++-- src/include/pg_config.h.in | 11 ++++++- src/tools/msvc/Solution.pm | 3 ++ 4 files changed, 91 insertions(+), 5 deletions(-) diff --git a/configure b/configure index 6d34243dca..fe66b79d69 100755 --- a/configure +++ b/configure @@ -8699,8 +8699,18 @@ else $as_echo "yes" >&6; } fi - LIBS="$LZ4_LIBS $LIBS" - CFLAGS="$LZ4_CFLAGS $CFLAGS" + # We only care about -I, -D, and -L switches; + # note that -llz4 will be added by AC_CHECK_LIB below. + for pgac_option in $LZ4_CFLAGS; do + case $pgac_option in + -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + esac + done + for pgac_option in $LZ4_LIBS; do + case $pgac_option in + -L*) LDFLAGS="$LDFLAGS $pgac_option";; + esac + done fi # @@ -12816,6 +12826,56 @@ fi fi +if test "$with_lz4" = yes ; then + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for LZ4_compress_default in -llz4" >&5 +$as_echo_n "checking for LZ4_compress_default in -llz4... " >&6; } +if ${ac_cv_lib_lz4_LZ4_compress_default+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-llz4 $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char LZ4_compress_default (); +int +main () +{ +return LZ4_compress_default (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_lz4_LZ4_compress_default=yes +else + ac_cv_lib_lz4_LZ4_compress_default=no +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_lz4_LZ4_compress_default" >&5 +$as_echo "$ac_cv_lib_lz4_LZ4_compress_default" >&6; } +if test "x$ac_cv_lib_lz4_LZ4_compress_default" = xyes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_LIBLZ4 1 +_ACEOF + + LIBS="-llz4 $LIBS" + +else + as_fn_error $? "library 'lz4' is required for LZ4 support" "$LINENO" 5 +fi + +fi + # Note: We can test for libldap_r only after we know PTHREAD_LIBS if test "$with_ldap" = yes ; then _LIBS="$LIBS" diff --git a/configure.ac b/configure.ac index e54e2fb632..76568d1e4b 100644 --- a/configure.ac +++ b/configure.ac @@ -997,8 +997,18 @@ AC_SUBST(with_lz4) if test "$with_lz4" = yes; then PKG_CHECK_MODULES(LZ4, liblz4) - LIBS="$LZ4_LIBS $LIBS" - CFLAGS="$LZ4_CFLAGS $CFLAGS" + # We only care about -I, -D, and -L switches; + # note that -llz4 will be added by AC_CHECK_LIB below. + for pgac_option in $LZ4_CFLAGS; do + case $pgac_option in + -I*|-D*) CPPFLAGS="$CPPFLAGS $pgac_option";; + esac + done + for pgac_option in $LZ4_LIBS; do + case $pgac_option in + -L*) LDFLAGS="$LDFLAGS $pgac_option";; + esac + done fi # @@ -1271,6 +1281,10 @@ if test "$with_libxslt" = yes ; then AC_CHECK_LIB(xslt, xsltCleanupGlobals, [], [AC_MSG_ERROR([library 'xslt' is required for XSLT support])]) fi +if test "$with_lz4" = yes ; then + AC_CHECK_LIB(lz4, LZ4_compress_default, [], [AC_MSG_ERROR([library 'lz4' is required for LZ4 support])]) +fi + # Note: We can test for libldap_r only after we know PTHREAD_LIBS if test "$with_ldap" = yes ; then _LIBS="$LIBS" diff --git a/src/include/pg_config.h.in b/src/include/pg_config.h.in index d873c177cb..fcbf336704 100644 --- a/src/include/pg_config.h.in +++ b/src/include/pg_config.h.in @@ -319,6 +319,9 @@ /* Define to 1 if you have the `ldap_r' library (-lldap_r). */ #undef HAVE_LIBLDAP_R +/* Define to 1 if you have the `lz4' library (-llz4). */ +#undef HAVE_LIBLZ4 + /* Define to 1 if you have the `m' library (-lm). */ #undef HAVE_LIBM @@ -358,6 +361,12 @@ /* Define to 1 if `long long int' works and is 64 bits. */ #undef HAVE_LONG_LONG_INT_64 +/* Define to 1 if you have the header file. */ +#undef HAVE_LZ4_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_LZ4_LZ4_H + /* Define to 1 if you have the header file. */ #undef HAVE_MBARRIER_H @@ -902,7 +911,7 @@ /* Define to 1 to build with LLVM based JIT support. (--with-llvm) */ #undef USE_LLVM -/* Define to 1 to build with LZ4 support (--with-lz4) */ +/* Define to 1 to build with LZ4 support. (--with-lz4) */ #undef USE_LZ4 /* Define to select named POSIX semaphores. */ diff --git a/src/tools/msvc/Solution.pm b/src/tools/msvc/Solution.pm index ea8ed4be30..9342347c9e 100644 --- a/src/tools/msvc/Solution.pm +++ b/src/tools/msvc/Solution.pm @@ -298,6 +298,7 @@ sub GenerateFiles HAVE_LIBCRYPTO => undef, HAVE_LIBLDAP => undef, HAVE_LIBLDAP_R => undef, + HAVE_LIBLZ4 => undef, HAVE_LIBM => undef, HAVE_LIBPAM => undef, HAVE_LIBREADLINE => undef, @@ -311,6 +312,8 @@ sub GenerateFiles HAVE_LOCALE_T => 1, HAVE_LONG_INT_64 => undef, HAVE_LONG_LONG_INT_64 => 1, + HAVE_LZ4_H => undef, + HAVE_LZ4_LZ4_H => undef, HAVE_MBARRIER_H => undef, HAVE_MBSTOWCS_L => 1, HAVE_MEMORY_H => 1, -- 2.39.5