Merge r1761824, r1771789, r1771827, r1779111 from trunk:

mod_brotli: Unbreak building other filter modules without libbrotlienc.

Don't add -lbrotlienc to the MOD_LDFLAGS unconditionally.  And, when
adding it, use MOD_BROTLI_LDADD to avoid linking all filter modules
against this library.


mod_brotli: Rewrite the autoconf script in a, hopefully, less convoluted way.

Explicitly handle different cases when we do a pkg-config lookup
(<nothing>, --with-brotli or --with-brotli=yes) or examine the path
provided by the user (--with-brotli=PATH).

This lays the groundwork to simplify the switch to the official Brotli
library (https://github.com/google/brotli), instead of expecting the
install layout of a third-party wrapper (https://github.com/bagder/libbrotli).


mod_brotli: Update makefiles to use the library layout of the official
Brotli repository.

With the recent update (https://github.com/google/brotli/pull/464), the
official repository now produces pkg-config metadata files (brotli.pc),
and has a fixed library layout (libbrotlicommon/libbrotlienc/libbrotlidec)
on both Windows and Linux.  Expect this layout in the makefiles, and take
advantage of the pkg-config metadata, if it's available.


mod_brotli: Update makefile to cope with the pkg-config layout change
in https://github.com/google/brotli/commit/fe9f9a9

There's a typo in the upstream commit [1] (s/brotlicommon/libbrotlicommon)
that currently produces an unusable libbrotlienc.pc file, but hopefully
this is going to be fixed there.

[1] https://github.com/google/brotli/commit/fe9f9a9#diff-af3b638bc2a3e6c650974192a53c7291R409

Submitted by: kotkov
Reviewed by: kotkov, covener, jim


git-svn-id: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x@1793464 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Jim Jagielski
2017-05-02 10:59:42 +00:00
parent b7305440fa
commit 3e5949d001
3 changed files with 48 additions and 133 deletions

View File

@ -58,8 +58,8 @@ ELSE()
SET(default_nghttp2_libraries "${CMAKE_INSTALL_PREFIX}/lib/nghttp2.lib")
ENDIF()
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/brotli_enc.lib")
SET(default_brotli_libraries "${CMAKE_INSTALL_PREFIX}/lib/brotli_enc.lib" "${CMAKE_INSTALL_PREFIX}/lib/brotli_common.lib")
IF(EXISTS "${CMAKE_INSTALL_PREFIX}/lib/brotlienc.lib")
SET(default_brotli_libraries "${CMAKE_INSTALL_PREFIX}/lib/brotlienc.lib" "${CMAKE_INSTALL_PREFIX}/lib/brotlicommon.lib")
ELSE()
SET(default_brotli_libraries)
ENDIF()

14
STATUS
View File

@ -125,20 +125,6 @@ RELEASE SHOWSTOPPERS:
PATCHES ACCEPTED TO BACKPORT FROM TRUNK:
[ start all new proposals below, under PATCHES PROPOSED. ]
*) mod_brotli: Fix two build issues (failing Unix build when mod_brotli
is not being built and invalid library filenames in CMakeFiles).
trunk patch: https://svn.apache.org/r1761824
https://svn.apache.org/r1771789
https://svn.apache.org/r1771827
https://svn.apache.org/r1779111
2.4.x patch: https://svn.apache.org/repos/asf/httpd/httpd/branches/2.4.x-r1761824-group
Note: These changesets were missing in the original mod_brotli backport
proposal merged in r1791231. They fix the described problems and avoid
having unnecessarily different modules/filters/config.m4 file contents
in trunk and in the 2.4.x branch. See the related discussion in
https://lists.apache.org/thread.html/a83741642c3d20f383efdf2c427829b2f37cb81e98c0a1756a2c19ce@%3Cdev.httpd.apache.org%3E
+1: kotkov, covener, jim
* core: don't run configtest in -V mode when MPM DSOs are in use, and try to
print compile settings even if reading the configuration fails. Fixes
PR61009.

View File

@ -140,125 +140,54 @@ APACHE_MODULE(proxy_html, Fix HTML Links in a Reverse Proxy, , , , [
]
)
dnl
dnl APACHE_CHECK_BROTLI
dnl
dnl Configure for Brotli, giving preference to
dnl "--with-brotli=<path>" if it was specified.
dnl
AC_DEFUN([APACHE_CHECK_BROTLI],[
AC_CACHE_CHECK([for Brotli], [ac_cv_brotli], [
dnl initialise the variables we use
ac_cv_brotli=no
ac_brotli_found=""
ac_brotli_base=""
ac_brotli_libs=""
ac_brotli_mod_cflags=""
ac_brotli_mod_ldflags=""
dnl Determine the Brotli base directory, if any
AC_MSG_CHECKING([for user-provided Brotli base directory])
AC_ARG_WITH(brotli, APACHE_HELP_STRING(--with-brotli=PATH,Brotli installation directory), [
dnl If --with-brotli specifies a directory, we use that directory
if test "x$withval" != "xyes" -a "x$withval" != "x"; then
dnl This ensures $withval is actually a directory and that it is absolute
ac_brotli_base="`cd $withval ; pwd`"
fi
])
if test "x$ac_brotli_base" = "x"; then
AC_MSG_RESULT(none)
else
AC_MSG_RESULT($ac_brotli_base)
fi
dnl Run header and version checks
saved_CPPFLAGS="$CPPFLAGS"
saved_LIBS="$LIBS"
saved_LDFLAGS="$LDFLAGS"
dnl Before doing anything else, load in pkg-config variables
if test -n "$PKGCONFIG"; then
saved_PKG_CONFIG_PATH="$PKG_CONFIG_PATH"
if test "x$ac_brotli_base" != "x" -a \
-f "${ac_brotli_base}/lib/pkgconfig/libbrotlienc.pc"; then
dnl Ensure that the given path is used by pkg-config too, otherwise
dnl the system libbrotlienc.pc might be picked up instead.
PKG_CONFIG_PATH="${ac_brotli_base}/lib/pkgconfig${PKG_CONFIG_PATH+:}${PKG_CONFIG_PATH}"
export PKG_CONFIG_PATH
fi
ac_brotli_libs="`$PKGCONFIG --libs-only-l --silence-errors libbrotlienc`"
if test $? -eq 0; then
ac_brotli_found="yes"
pkglookup="`$PKGCONFIG --cflags-only-I libbrotlienc`"
APR_ADDTO(CPPFLAGS, [$pkglookup])
APR_ADDTO(MOD_CFLAGS, [$pkglookup])
pkglookup="`$PKGCONFIG --libs-only-L libbrotlienc`"
APR_ADDTO(LDFLAGS, [$pkglookup])
APR_ADDTO(MOD_LDFLAGS, [$pkglookup])
pkglookup="`$PKGCONFIG --libs-only-other libbrotlienc`"
APR_ADDTO(LDFLAGS, [$pkglookup])
APR_ADDTO(MOD_LDFLAGS, [$pkglookup])
fi
PKG_CONFIG_PATH="$saved_PKG_CONFIG_PATH"
fi
dnl fall back to the user-supplied directory if not found via pkg-config
if test "x$ac_brotli_base" != "x" -a "x$ac_brotli_found" = "x"; then
APR_ADDTO(CPPFLAGS, [-I$ac_brotli_base/include])
APR_ADDTO(MOD_CFLAGS, [-I$ac_brotli_base/include])
APR_ADDTO(LDFLAGS, [-L$ac_brotli_base/lib])
APR_ADDTO(MOD_LDFLAGS, [-L$ac_brotli_base/lib])
if test "x$ap_platform_runtime_link_flag" != "x"; then
APR_ADDTO(LDFLAGS, [$ap_platform_runtime_link_flag$ac_brotli_base/lib])
APR_ADDTO(MOD_LDFLAGS, [$ap_platform_runtime_link_flag$ac_brotli_base/lib])
fi
fi
ac_brotli_libs="${ac_brotli_libs:--lbrotlienc `$apr_config --libs`} "
APR_ADDTO(MOD_LDFLAGS, [$ac_brotli_libs])
APR_ADDTO(LIBS, [$ac_brotli_libs])
dnl Run library and function checks
liberrors=""
AC_CHECK_HEADERS([brotli/encode.h])
AC_MSG_CHECKING([for Brotli version >= 0.6.0])
AC_TRY_COMPILE([#include <brotli/encode.h>],[
const uint8_t *o = BrotliEncoderTakeOutput((BrotliEncoderState*)0, (size_t*)0);
if (o) return *o;],
[AC_MSG_RESULT(OK)
ac_cv_brotli="yes"],
[AC_MSG_RESULT(FAILED)])
dnl restore
CPPFLAGS="$saved_CPPFLAGS"
LIBS="$saved_LIBS"
LDFLAGS="$saved_LDFLAGS"
dnl cache MOD_LDFLAGS, MOD_CFLAGS
ac_brotli_mod_cflags=$MOD_CFLAGS
ac_brotli_mod_ldflags=$MOD_LDFLAGS
])
if test "x$ac_cv_brotli" = "xyes"; then
APR_ADDTO(MOD_LDFLAGS, [$ac_brotli_mod_ldflags])
dnl Ouch! libbrotlienc.1.so doesn't link against libm.so (-lm),
dnl although it should. Workaround that in our LDFLAGS:
APR_ADDTO(MOD_LDFLAGS, ["-lm"])
APR_ADDTO(MOD_CFLAGS, [$ac_brotli_mod_cflags])
fi
])
APACHE_MODULE(brotli, Brotli compression support, , , most, [
APACHE_CHECK_BROTLI
if test "$ac_cv_brotli" = "yes" ; then
if test "x$enable_brotli" = "xshared"; then
# The only symbol which needs to be exported is the module
# structure, so ask libtool to hide everything else:
APR_ADDTO(MOD_BROTLI_LDADD, [-export-symbols-regex brotli_module])
fi
AC_ARG_WITH(brotli, APACHE_HELP_STRING(--with-brotli=PATH,Brotli installation directory),[
if test "$withval" != "yes" -a "x$withval" != "x"; then
ap_brotli_base="$withval"
ap_brotli_with=yes
fi
])
ap_brotli_found=no
if test -n "$ap_brotli_base"; then
ap_save_cppflags=$CPPFLAGS
APR_ADDTO(CPPFLAGS, [-I${ap_brotli_base}/include])
AC_MSG_CHECKING([for Brotli library >= 0.6.0 via prefix])
AC_TRY_COMPILE(
[#include <brotli/encode.h>],[
const uint8_t *o = BrotliEncoderTakeOutput((BrotliEncoderState*)0, (size_t*)0);],
[AC_MSG_RESULT(yes)
ap_brotli_found=yes
ap_brotli_cflags="-I${ap_brotli_base}/include"
ap_brotli_libs="-L${ap_brotli_base}/lib -lbrotlienc -lbrotlicommon"],
[AC_MSG_RESULT(no)]
)
CPPFLAGS=$ap_save_cppflags
else
enable_brotli=no
if test -n "$PKGCONFIG"; then
AC_MSG_CHECKING([for Brotli library >= 0.6.0 via pkg-config])
if $PKGCONFIG --exists "libbrotlienc >= 0.6.0"; then
AC_MSG_RESULT(yes)
ap_brotli_found=yes
ap_brotli_cflags=`$PKGCONFIG libbrotlienc --cflags`
ap_brotli_libs=`$PKGCONFIG libbrotlienc --libs`
else
AC_MSG_RESULT(no)
fi
fi
fi
if test "$ap_brotli_found" = "yes"; then
APR_ADDTO(MOD_CFLAGS, [$ap_brotli_cflags])
APR_ADDTO(MOD_BROTLI_LDADD, [$ap_brotli_libs])
if test "$enable_brotli" = "shared"; then
dnl The only symbol which needs to be exported is the module
dnl structure, so ask libtool to hide everything else:
APR_ADDTO(MOD_BROTLI_LDADD, [-export-symbols-regex brotli_module])
fi
else
enable_brotli=no
if test "$ap_brotli_with" = "yes"; then
AC_MSG_ERROR([Brotli library was missing or unusable])
fi
fi
])