# 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’ [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" 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( \"

Test

Test Text

\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"