a4ac43e4d4
* travis: get it building and passing tests I initially planned to get this working on Ubuntu 12, but decided it wasn't worth it and switched to Ubuntu 14 (Trusty). Now it passes tests on Travis, so I've added other people's emails back to the set of people to send emails to. Also update mps while we're at it. * update mps * update mps * ngx_pagespeed depends on luuid * update mps
385 lines
13 KiB
Plaintext
385 lines
13 KiB
Plaintext
# Copyright 2012 Google Inc.
|
||
#
|
||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||
# you may not use this file except in compliance with the License.
|
||
# You may obtain a copy of the License at
|
||
#
|
||
# http://www.apache.org/licenses/LICENSE-2.0
|
||
#
|
||
# Unless required by applicable law or agreed to in writing, software
|
||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
# See the License for the specific language governing permissions and
|
||
# limitations under the License.
|
||
#
|
||
# Environment Variables (Optional):
|
||
# MOD_PAGESPEED_DIR: absolute path to the mod_pagespeed/src directory
|
||
# PSOL_BINARY: absolute path to pagespeed_automatic.a
|
||
|
||
mod_pagespeed_dir="${MOD_PAGESPEED_DIR:-unset}"
|
||
position_aux="${POSITION_AUX:-unset}"
|
||
|
||
if [ "$mod_pagespeed_dir" = "unset" ] ; then
|
||
mod_pagespeed_dir="$ngx_addon_dir/psol/include"
|
||
build_from_source=false
|
||
|
||
if [ ! -e "$mod_pagespeed_dir" ] ; then
|
||
echo "ngx_pagespeed: pagespeed optimization library not found:"
|
||
|
||
psol_binary_url="$($ngx_addon_dir/scripts/format_binary_url.sh \
|
||
$ngx_addon_dir/PSOL_BINARY_URL)"
|
||
if [[ "$psol_binary_url" != https://* ]]; then
|
||
echo "
|
||
This is a development branch of ngx_pagespeed, which means there is no
|
||
precompiled PSOL library available to link against. Either build from a
|
||
release tag, like latest-beta, or build PSOL from source:
|
||
https://github.com/pagespeed/ngx_pagespeed/wiki/Building-PSOL-From-Source"
|
||
exit 1
|
||
fi
|
||
|
||
echo "
|
||
You need to separately download the pagespeed library:
|
||
$ cd $ngx_addon_dir
|
||
$ wget $psol_binary_url
|
||
$ tar -xzvf $(basename $psol_binary_url) # expands to psol/
|
||
|
||
Or see the installation instructions:
|
||
https://developers.google.com/speed/pagespeed/module/build_ngx_pagespeed_from_source"
|
||
exit 1
|
||
fi
|
||
else
|
||
build_from_source=true
|
||
fi
|
||
|
||
os_name='unknown_os'
|
||
arch_name='unknown_arch'
|
||
uname_os=`uname`
|
||
uname_arch=`uname -m`
|
||
|
||
if [ $uname_os = 'Linux' ]; then
|
||
os_name='linux'
|
||
elif [ $uname_os = 'Darwin' ]; then
|
||
os_name='mac'
|
||
else
|
||
echo "OS not supported: $uname_os"
|
||
exit 1
|
||
fi
|
||
|
||
if [ $uname_arch = 'x86_64' -o $uname_arch = 'amd64' ]; then
|
||
arch_name='x64'
|
||
elif [ $uname_arch = 'x86_32' -o $uname_arch = 'i686' \
|
||
-o $uname_arch = 'i386' ]; then
|
||
arch_name='ia32'
|
||
else
|
||
echo "Architecture not supported: $uname_arch"
|
||
exit 1
|
||
fi
|
||
|
||
if [ "$NGX_DEBUG" = "YES" ]; then
|
||
buildtype=Debug
|
||
# If we're using a psol tarball that doesn't contain Debug/ (which is the case
|
||
# from 1.12 onward) then this will be overriden to buildtype=Release below.
|
||
else
|
||
buildtype=Release
|
||
fi
|
||
|
||
# If the compiler is gcc, we want to use g++ to link, if at all possible,
|
||
# so that -static-libstdc++ works.
|
||
# Annoyingly, the feature test doesn't even use $LINK for linking, so that
|
||
# needs an explicit -lstdc++
|
||
pagespeed_libs=
|
||
ps_maybe_gpp_base=`basename $CC| sed s/gcc/g++/`
|
||
ps_maybe_gpp="`dirname $CC`/$ps_maybe_gpp_base"
|
||
if [ -n "$NGX_GCC_VER" -a \( -x "$ps_maybe_gpp" \) ]; then
|
||
LINK=$ps_maybe_gpp
|
||
fi
|
||
pagespeed_libs="-lstdc++"
|
||
|
||
# The compiler needs to know that __sync_add_and_fetch_4 is ok,
|
||
# and this requires an instruction that didn't exist on i586 or i386.
|
||
if [ "$uname_arch" = "i686" ]; then
|
||
FLAG_MARCH='-march=i686'
|
||
fi
|
||
|
||
CFLAGS="$CFLAGS $FLAG_MARCH"
|
||
|
||
# For now, standardize on gcc-4.x ABI --- if we don't set this, people building
|
||
# with new gcc defaulting to gcc-5 C++11 ABI will have build trouble linking
|
||
# to our libpsol.a
|
||
# See https://gcc.gnu.org/onlinedocs/libstdc++/manual/using_dual_abi.html
|
||
CFLAGS="$CFLAGS -D_GLIBCXX_USE_CXX11_ABI=0"
|
||
CC_OLD_TEST_FLAGS="$CC_TEST_FLAGS"
|
||
CC_TEST_FLAGS="$CC_TEST_FLAGS -D_GLIBCXX_USE_CXX11_ABI=0 --std=c++11"
|
||
|
||
case "$NGX_GCC_VER" in
|
||
4.8*)
|
||
# On GCC 4.8 and above, -Wall enables -Wunused-local-typedefs. This breaks
|
||
# on VerifySizesAreEqual in bit_cast in chromium/src/base/basictypes.h which
|
||
# has a typedef that is intentionally unused.
|
||
CFLAGS="$CFLAGS -Wno-unused-local-typedefs"
|
||
|
||
# On GCC 4.8 and above, we get the following compiler warning:
|
||
# chromium/src/base/memory/scoped_ptr.h:133:7: warning: declaration of ‘class scoped_ptr<C>’ [enabled by default]
|
||
# Based on discussion at http://gcc.gnu.org/bugzilla/show_bug.cgi?id=54055,
|
||
# this is invalid code, but hasn't been fixed yet in chromium.
|
||
# Unfortunately, there also does not appear to be a flag for just disabling
|
||
# that warning, so we add Wno-error to override nginx's default -Werror
|
||
# option.
|
||
CFLAGS="$CFLAGS -Wno-error"
|
||
;;
|
||
esac
|
||
|
||
# workaround for a bug in nginx-1.9.11, see:
|
||
# http://hg.nginx.org/nginx/rev/ff1e625ae55b
|
||
NGX_VERSION=`grep nginx_version src/core/nginx.h | sed -e 's/^.* \(.*\)$/\1/'`
|
||
if [ "$NGX_VERSION" = "1009011" ]; then
|
||
CFLAGS="$CFLAGS -Wno-write-strings"
|
||
fi
|
||
|
||
if [ "$WNO_ERROR" = "YES" ]; then
|
||
CFLAGS="$CFLAGS -Wno-error"
|
||
fi
|
||
|
||
psol_binary="${PSOL_BINARY:-unset}"
|
||
if [ "$psol_binary" = "unset" ] ; then
|
||
if $build_from_source ; then
|
||
psol_binary="\
|
||
$mod_pagespeed_dir/pagespeed/automatic/pagespeed_automatic.a"
|
||
else
|
||
if ! [ -d "$ngx_addon_dir/psol/lib/$buildtype" ]; then
|
||
echo "
|
||
You have set --with-debug for building nginx, but precompiled Debug binaries for
|
||
PSOL, which ngx_pagespeed depends on, aren't available. If you're trying to
|
||
debug PSOL you need to build it from source. If you just want to run nginx with
|
||
debug-level logging you can use the Release binaries."
|
||
echo -n "
|
||
Use the available Release binaries?"
|
||
read -p " [Y/n] " yn
|
||
if [[ "$yn" == N* || "$yn" == n* ]]; then
|
||
echo "Cancelled."
|
||
exit 1
|
||
fi
|
||
|
||
buildtype=Release
|
||
fi
|
||
psol_library_dir="$ngx_addon_dir/psol/lib/$buildtype/$os_name/$arch_name"
|
||
psol_binary="$psol_library_dir/pagespeed_automatic.a"
|
||
fi
|
||
fi
|
||
|
||
echo "mod_pagespeed_dir=$mod_pagespeed_dir"
|
||
echo "build_from_source=$build_from_source"
|
||
|
||
ngx_feature="psol"
|
||
ngx_feature_name=""
|
||
ngx_feature_run=no
|
||
ngx_feature_incs="
|
||
#include \"pagespeed/kernel/base/string.h\"
|
||
#include \"pagespeed/kernel/base/string_writer.h\"
|
||
#include \"pagespeed/kernel/base/null_message_handler.h\"
|
||
#include \"pagespeed/kernel/html/html_parse.h\"
|
||
#include \"pagespeed/kernel/html/html_writer_filter.h\"
|
||
"
|
||
|
||
pagespeed_include="\
|
||
$mod_pagespeed_dir \
|
||
$mod_pagespeed_dir/third_party/chromium/src \
|
||
$mod_pagespeed_dir/third_party/google-sparsehash/src/src \
|
||
$mod_pagespeed_dir/third_party/google-sparsehash/gen/arch/$os_name/$arch_name/include \
|
||
$mod_pagespeed_dir/third_party/grpc/src/include \
|
||
$mod_pagespeed_dir/third_party/protobuf/src/src \
|
||
$mod_pagespeed_dir/third_party/re2/src \
|
||
$mod_pagespeed_dir/out/$buildtype/obj/gen \
|
||
$mod_pagespeed_dir/out/$buildtype/obj/gen/protoc_out/instaweb \
|
||
$mod_pagespeed_dir/third_party/apr/src/include \
|
||
$mod_pagespeed_dir/third_party/aprutil/src/include \
|
||
$mod_pagespeed_dir/third_party/apr/gen/arch/$os_name/$arch_name/include \
|
||
$mod_pagespeed_dir/third_party/aprutil/gen/arch/$os_name/$arch_name/include \
|
||
$mod_pagespeed_dir/url"
|
||
ngx_feature_path="$pagespeed_include"
|
||
|
||
pagespeed_libs="$psol_binary $pagespeed_libs -lrt -pthread -lm -luuid"
|
||
ngx_feature_libs="$pagespeed_libs"
|
||
ngx_feature_test="
|
||
|
||
GoogleString output_buffer;
|
||
net_instaweb::StringWriter write_to_string(&output_buffer);
|
||
|
||
net_instaweb::NullMessageHandler handler;
|
||
net_instaweb::HtmlParse html_parse(&handler);
|
||
net_instaweb::HtmlWriterFilter html_writer_filter(&html_parse);
|
||
|
||
html_writer_filter.set_writer(&write_to_string);
|
||
html_parse.AddFilter(&html_writer_filter);
|
||
|
||
html_parse.StartParse(\"http:example.com\");
|
||
html_parse.ParseText(
|
||
\"<html ><body ><h1 >Test</h1 ><p>Test Text</p></body></html>\n\");
|
||
html_parse.FinishParse();
|
||
|
||
printf(\"parsed as: %s\", output_buffer.c_str())"
|
||
|
||
# Test whether we have pagespeed and can compile and link against it.
|
||
. "$ngx_addon_dir/cpp_feature"
|
||
|
||
if [ $ngx_found = no ]; then
|
||
cat << END
|
||
$0: error: module ngx_pagespeed requires the pagespeed optimization library.
|
||
Look in $PWD/$NGX_AUTOCONF_ERR for more details.
|
||
END
|
||
exit 1
|
||
fi
|
||
|
||
ps_src="$ngx_addon_dir/src"
|
||
ngx_addon_name=ngx_pagespeed
|
||
NGX_ADDON_DEPS="$NGX_ADDON_DEPS \
|
||
$ps_src/log_message_handler.h \
|
||
$ps_src/ngx_base_fetch.h \
|
||
$ps_src/ngx_caching_headers.h \
|
||
$ps_src/ngx_event_connection.h \
|
||
$ps_src/ngx_fetch.h \
|
||
$ps_src/ngx_gzip_setter.h \
|
||
$ps_src/ngx_list_iterator.h \
|
||
$ps_src/ngx_message_handler.h \
|
||
$ps_src/ngx_pagespeed.h \
|
||
$ps_src/ngx_rewrite_driver_factory.h \
|
||
$ps_src/ngx_rewrite_options.h \
|
||
$ps_src/ngx_server_context.h \
|
||
$ps_src/ngx_url_async_fetcher.h \
|
||
$psol_binary"
|
||
NPS_SRCS=" \
|
||
$ps_src/log_message_handler.cc \
|
||
$ps_src/ngx_base_fetch.cc \
|
||
$ps_src/ngx_caching_headers.cc \
|
||
$ps_src/ngx_event_connection.cc \
|
||
$ps_src/ngx_fetch.cc \
|
||
$ps_src/ngx_gzip_setter.cc \
|
||
$ps_src/ngx_list_iterator.cc \
|
||
$ps_src/ngx_message_handler.cc \
|
||
$ps_src/ngx_pagespeed.cc \
|
||
$ps_src/ngx_rewrite_driver_factory.cc \
|
||
$ps_src/ngx_rewrite_options.cc \
|
||
$ps_src/ngx_server_context.cc \
|
||
$ps_src/ngx_url_async_fetcher.cc"
|
||
# Save our sources in a separate var since we may need it in config.make
|
||
PS_NGX_SRCS="$NGX_ADDON_SRCS \
|
||
$NPS_SRCS"
|
||
|
||
# Make pagespeed run immediately before gzip and Brotli.
|
||
if echo $HTTP_FILTER_MODULES | grep ngx_http_brotli_filter_module >/dev/null; then
|
||
next=ngx_http_brotli_filter_module
|
||
elif [ $HTTP_GZIP = YES ]; then
|
||
next=ngx_http_gzip_filter_module
|
||
else
|
||
next=ngx_http_range_header_filter_module
|
||
fi
|
||
|
||
if [ -n "$ngx_module_link" ]; then
|
||
# nginx-1.9.11+
|
||
ngx_module_type=HTTP_FILTER
|
||
ngx_module_name="ngx_pagespeed ngx_pagespeed_etag_filter"
|
||
ngx_module_incs="$ngx_feature_path"
|
||
ngx_module_deps=
|
||
ngx_module_srcs="$NPS_SRCS"
|
||
ngx_module_libs="$ngx_feature_libs"
|
||
ngx_module_order="ngx_http_range_header_filter_module\
|
||
ngx_pagespeed_etag_filter\
|
||
ngx_http_gzip_filter_module \
|
||
ngx_http_brotli_filter_module \
|
||
ngx_pagespeed \
|
||
ngx_http_postpone_filter_module \
|
||
ngx_http_ssi_filter_module \
|
||
ngx_http_charset_filter_module \
|
||
ngx_http_xslt_filter_module \
|
||
ngx_http_image_filter_module \
|
||
ngx_http_sub_filter_module \
|
||
ngx_http_addition_filter_module \
|
||
ngx_http_gunzip_filter_module \
|
||
ngx_http_userid_filter_module \
|
||
ngx_http_headers_filter_module"
|
||
|
||
. auto/module
|
||
|
||
if [ $ngx_module_link != DYNAMIC ]; then
|
||
# ngx_module_order doesn't work with static modules,
|
||
# so we must re-order filters here.
|
||
if [ "$position_aux" = "true" ] ; then
|
||
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"
|
||
else
|
||
HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES \
|
||
| sed "s/ngx_pagespeed//" \
|
||
| sed "s/$next/$next ngx_pagespeed/")
|
||
fi
|
||
# Make the etag header filter run immediately before range header filter.
|
||
HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES \
|
||
| sed "s/ngx_pagespeed_etag_filter//" \
|
||
| sed "s/ngx_http_range_header_filter_module/ngx_http_range_header_filter_module ngx_pagespeed_etag_filter/")
|
||
else
|
||
if [ "$position_aux" = "true" ] ; then
|
||
ngx_module_type=HTTP_AUX_FILTER
|
||
ngx_module_order=""
|
||
fi
|
||
fi
|
||
else
|
||
CORE_LIBS="$CORE_LIBS $pagespeed_libs"
|
||
CORE_INCS="$CORE_INCS $pagespeed_include"
|
||
NGX_ADDON_SRCS="$PS_NGX_SRCS"
|
||
if [ "$position_aux" = "true" ] ; then
|
||
HTTP_AUX_FILTER_MODULES="$HTTP_AUX_FILTER_MODULES $ngx_addon_name"
|
||
else
|
||
HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES | sed "s/$next/$next $ngx_addon_name/")
|
||
fi
|
||
|
||
# Make the etag header filter run immediately before range header filter.
|
||
HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES |\
|
||
sed "s/ngx_http_range_header_filter_module/ngx_http_range_header_filter_module ngx_pagespeed_etag_filter/")
|
||
fi
|
||
|
||
echo "List of modules (in reverse order of applicability): "$HTTP_FILTER_MODULES
|
||
|
||
# Test whether the compiler is compatible
|
||
ngx_feature="psol-compiler-compat"
|
||
ngx_feature_name=""
|
||
ngx_feature_run=no
|
||
ngx_feature_incs=""
|
||
ngx_feature_path=""
|
||
ngx_feature_libs="-lstdc++"
|
||
ngx_feature_test="
|
||
|
||
#if defined(__clang__) && defined(__GLIBCXX__)
|
||
// See https://gcc.gnu.org/onlinedocs/libstdc++/manual/abi.html#abi.versioning
|
||
// for a list of various values of __GLIBCXX__. Note that they're not monotonic
|
||
// with respect to version numbers.
|
||
#if __GLIBCXX__ == 20120322 || __GLIBCXX__ == 20120614
|
||
#error \"clang is using libstdc++ 4.7.0 or 4.7.1, which can cause binary incompatibility.\"
|
||
#endif
|
||
#endif
|
||
|
||
#if !defined(__clang__) && defined(__GNUC__)
|
||
#if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ < 8)
|
||
#error \"GCC < 4.8 no longer supported. Please use gcc >= 4.8 or clang >= 3.3\"
|
||
#endif
|
||
#endif
|
||
|
||
#if defined(__clang__)
|
||
#if __clang_major__ < 3 || (__clang_major__ == 3 && __clang_minor__ < 3)
|
||
#error \"Please use gcc >= 4.8 or clang >= 3.3\"
|
||
#endif
|
||
#endif
|
||
"
|
||
|
||
. "$ngx_addon_dir/cpp_feature"
|
||
|
||
if [ $ngx_found = no ]; then
|
||
cat << END
|
||
$0: error: module ngx_pagespeed requires gcc >= 4.8 or clang >= 3.3.
|
||
See https://developers.google.com/speed/pagespeed/module/build_ngx_pagespeed_from_source for some recommendations.
|
||
Look in $PWD/$NGX_AUTOCONF_ERR for more details.
|
||
END
|
||
exit 1
|
||
fi
|
||
|
||
have=NGX_PAGESPEED . auto/have
|
||
|
||
CC_TEST_FLAGS="$CC_OLD_TEST_FLAGS"
|