# 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
#   PSOL_BUILDTYPE: Release or Debug

mod_pagespeed_dir="${MOD_PAGESPEED_DIR:-unset}"
position_aux="${POSITION_AUX:-unset}"
psol_buildtype="${PSOL_BUILDTYPE:-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/apache/incubator-pagespeed-ngx/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 [ "$psol_buildtype" = "unset" ] ; then
  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
else
  buildtype=$psol_buildtype
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"
