# Copyright (C) 2015-2016 Google Inc.
# All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions
# are met:
# 1. Redistributions of source code must retain the above copyright
#    notice, this list of conditions and the following disclaimer.
# 2. Redistributions in binary form must reproduce the above copyright
#    notice, this list of conditions and the following disclaimer in the
#    documentation and/or other materials provided with the distribution.
#
# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
# ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
# SUCH DAMAGE.

ngx_addon_name=ngx_brotli

if [ -z "$ngx_module_link" ]; then
cat << END

$0: error: Brotli module requires recent version of NGINX (1.9.11+).

END
    exit 1
fi

#
# HTTP static module
#

ngx_module_type=HTTP
ngx_module_name=ngx_http_brotli_static_module
ngx_module_incs=
ngx_module_deps=
ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_static_module.c"
ngx_module_libs=
ngx_module_order=

. auto/module

have=NGX_HTTP_GZIP . auto/have
have=NGX_HTTP_BROTLI_STATIC . auto/have

#
# HTTP filter module with Brotli library
#

brotli="$ngx_addon_dir/deps/brotli"

if [ ! -f "$brotli/include/brotli/encode.h" ]; then
cat << END

$0: error: \
Brotli library is missing from the $brotli directory.

Please make sure that the git submodule has been checked out:

    cd $ngx_addon_dir && git submodule update --init && cd $PWD

END
    exit 1
fi

ngx_module_type=HTTP_FILTER
ngx_module_name=ngx_http_brotli_filter_module
ngx_module_incs="$brotli/include"
ngx_module_deps="$brotli/common/constants.h \
                 $brotli/common/dictionary.h \
                 $brotli/common/version.h \
                 $brotli/enc/backward_references.h \
                 $brotli/enc/backward_references_inc.h \
                 $brotli/enc/bit_cost.h \
                 $brotli/enc/bit_cost_inc.h \
                 $brotli/enc/block_encoder_inc.h \
                 $brotli/enc/block_splitter.h \
                 $brotli/enc/block_splitter_inc.h \
                 $brotli/enc/brotli_bit_stream.h \
                 $brotli/enc/cluster.h \
                 $brotli/enc/cluster_inc.h \
                 $brotli/enc/command.h \
                 $brotli/enc/compress_fragment.h \
                 $brotli/enc/compress_fragment_two_pass.h \
                 $brotli/enc/context.h \
                 $brotli/enc/dictionary_hash.h \
                 $brotli/enc/entropy_encode.h \
                 $brotli/enc/entropy_encode_static.h \
                 $brotli/enc/fast_log.h \
                 $brotli/enc/find_match_length.h \
                 $brotli/enc/hash_forgetful_chain_inc.h \
                 $brotli/enc/hash.h \
                 $brotli/enc/hash_longest_match_inc.h \
                 $brotli/enc/hash_longest_match_quickly_inc.h \
                 $brotli/enc/histogram.h \
                 $brotli/enc/histogram_inc.h \
                 $brotli/enc/literal_cost.h \
                 $brotli/enc/memory.h \
                 $brotli/enc/metablock.h \
                 $brotli/enc/metablock_inc.h \
                 $brotli/enc/port.h \
                 $brotli/enc/prefix.h \
                 $brotli/enc/quality.h \
                 $brotli/enc/ringbuffer.h \
                 $brotli/enc/static_dict.h \
                 $brotli/enc/static_dict_lut.h \
                 $brotli/enc/utf8_util.h \
                 $brotli/enc/write_bits.h"
ngx_module_srcs="$brotli/common/dictionary.c \
                 $brotli/enc/backward_references.c \
                 $brotli/enc/bit_cost.c \
                 $brotli/enc/block_splitter.c \
                 $brotli/enc/brotli_bit_stream.c \
                 $brotli/enc/cluster.c \
                 $brotli/enc/compress_fragment.c \
                 $brotli/enc/compress_fragment_two_pass.c \
                 $brotli/enc/encode.c \
                 $brotli/enc/entropy_encode.c \
                 $brotli/enc/histogram.c \
                 $brotli/enc/literal_cost.c \
                 $brotli/enc/memory.c \
                 $brotli/enc/metablock.c \
                 $brotli/enc/static_dict.c \
                 $brotli/enc/utf8_util.c \
                 $ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
ngx_module_libs="-lm"
ngx_module_order="$ngx_module_name \
                  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 \
                  ngx_http_copy_filter_module \
                  ngx_http_range_body_filter_module \
                  ngx_http_not_modified_filter_module \
                  ngx_http_slice_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 [ "$HTTP_GZIP" = YES ]; then
        next=ngx_http_gzip_filter_module
    elif echo $HTTP_FILTER_MODULES | grep pagespeed_etag_filter >/dev/null; then
        next=ngx_pagespeed_etag_filter
    else
        next=ngx_http_range_header_filter_module
    fi

    HTTP_FILTER_MODULES=`echo $HTTP_FILTER_MODULES \
                         | sed "s/$ngx_module_name//" \
                         | sed "s/$next/$next $ngx_module_name/"`
fi

CFLAGS="$CFLAGS -Wno-deprecated-declarations"

have=NGX_HTTP_BROTLI_FILTER . auto/have
