# 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}"
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:"
    echo ""
    echo "   You need to separately download the pagespeed library:"
    echo ""
    echo "     $ cd /path/to/ngx_pagespeed"
    echo "     $ wget https://dl.google.com/dl/page-speed/psol/1.5.27.2.tar.gz"
    echo "     $ tar -xzvf 1.5.27.2.tar.gz # expands to psol/"
    echo ""
    echo "   Or see the installation instructions:"
    echo "     https://github.com/pagespeed/ngx_pagespeed#how-to-build"
    exit 1
  fi

else
  build_from_source=true
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 \"net/instaweb/htmlparse/public/html_parse.h\"
#include \"net/instaweb/htmlparse/public/html_writer_filter.h\"
#include \"net/instaweb/util/public/string.h\"
#include \"net/instaweb/util/public/string_writer.h\"
#include \"net/instaweb/util/public/null_message_handler.h\"
"

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
else
  buildtype=Release
fi

pagespeed_include="\
  $mod_pagespeed_dir \
  $mod_pagespeed_dir/third_party/chromium/src \
  $mod_pagespeed_dir/third_party/google-sparsehash/src \
  $mod_pagespeed_dir/third_party/google-sparsehash/gen/arch/$os_name/$arch_name/include \
  $mod_pagespeed_dir/third_party/protobuf/src \
  $mod_pagespeed_dir/third_party/re2/src \
  $mod_pagespeed_dir/out/$buildtype/obj/gen \
  $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"
ngx_feature_path="$pagespeed_include"

if $build_from_source ; then
  psol_library_binaries="\
    $mod_pagespeed_dir/net/instaweb/automatic/pagespeed_automatic.a \
    $mod_pagespeed_dir/out/$buildtype/obj.target/third_party/serf/libserf.a \
    $mod_pagespeed_dir/out/$buildtype/obj.target/third_party/aprutil/libaprutil.a \
    $mod_pagespeed_dir/out/$buildtype/obj.target/third_party/apr/libapr.a"
else
  psol_library_dir="$ngx_addon_dir/psol/lib/$buildtype/$os_name/$arch_name"
  psol_library_binaries="\
    $psol_library_dir/pagespeed_automatic.a \
    $psol_library_dir/libserf.a \
    $psol_library_dir/libaprutil.a \
    $psol_library_dir/libapr.a"
fi

pagespeed_libs="-lstdc++ $psol_library_binaries -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(
      \"<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 = yes ]; then
  ps_src="$ngx_addon_dir/src"
  ngx_addon_name=ngx_pagespeed
  NGX_ADDON_DEPS="$NGX_ADDON_DEPS \
    $ps_src/ngx_pagespeed.h \
    $ps_src/ngx_fetch.h \
    $ps_src/ngx_url_async_fetcher.h \
    $ps_src/ngx_base_fetch.h \
    $ps_src/ngx_server_context.h \
    $ps_src/ngx_rewrite_options.h \
    $ps_src/ngx_rewrite_driver_factory.h \
    $ps_src/ngx_thread_system.h \
    $ps_src/ngx_message_handler.h \
    $ps_src/pthread_shared_mem.h \
    $ps_src/ngx_request_context.h \
    $ps_src/log_message_handler.h"
  NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
    $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_fetch.cc \
    $ps_src/ngx_url_async_fetcher.cc \
    $ps_src/ngx_base_fetch.cc \
    $ps_src/ngx_thread_system.cc \
    $ps_src/ngx_message_handler.cc \
    $ps_src/pthread_shared_mem.cc \
    $ps_src/ngx_request_context.cc \
    $ps_src/log_message_handler.cc \
    $mod_pagespeed_dir/net/instaweb/apache/add_headers_fetcher.cc \
    $mod_pagespeed_dir/net/instaweb/apache/loopback_route_fetcher.cc \
    $mod_pagespeed_dir/net/instaweb/apache/serf_url_async_fetcher.cc"
  # Make pagespeed run immediately before gzip.
  HTTP_FILTER_MODULES=$(echo $HTTP_FILTER_MODULES |\
    sed "s/$HTTP_GZIP_FILTER_MODULE/$HTTP_GZIP_FILTER_MODULE $ngx_addon_name/")
  CORE_LIBS="$CORE_LIBS $pagespeed_libs"
  CORE_INCS="$CORE_INCS $pagespeed_include"
else
  cat << END
$0: error: module ngx_pagespeed requires the pagespeed optimization library
END
  exit 1
fi

have=NGX_PAGESPEED . auto/have
