Brotli: bundle Brotli library.
Change-Id: I4e2e5d5625616cd6f2abb1774fa966b825cb0eca
Signed-off-by: Piotr Sikora <piotrsikora@google.com>
Reviewed-on: https://nginx-review.googlesource.com/2640
Reviewed-by: Gurgen Hrachyan <gugo@google.com>
diff --git a/.gitmodules b/.gitmodules
new file mode 100644
index 0000000..694f088
--- /dev/null
+++ b/.gitmodules
@@ -0,0 +1,3 @@
+[submodule "deps/brotli"]
+ path = deps/brotli
+ url = https://github.com/google/brotli.git
diff --git a/BUILD b/BUILD
index 0b0e6a9..0e1e785 100644
--- a/BUILD
+++ b/BUILD
@@ -33,7 +33,9 @@
srcs = [
"src/ngx_http_brotli_filter_module.c",
],
- copts = nginx_copts,
+ copts = nginx_copts + [
+ "-Wno-deprecated-declarations",
+ ],
defines = [
"NGX_HTTP_BROTLI_FILTER",
],
@@ -41,9 +43,9 @@
"//visibility:public",
],
deps = [
- "//external:brotli_enc",
"@nginx//:core",
"@nginx//:http",
+ "@org_brotli//:brotlienc",
],
)
diff --git a/README.md b/README.md
index 6b35f10..3f90b34 100644
--- a/README.md
+++ b/README.md
@@ -21,18 +21,6 @@
$ ./configure --add-module=/path/to/ngx_brotli
$ make && make install
-ngx_brotli filter module depends on
-[libbrotli](https://github.com/bagder/libbrotli),
-which must be installed on the target system for it to work.
-
-Alternatively, ngx_brotli static module can be compiled into nginx by itself
-with `NGX_BROTLI_STATIC_MODULE_ONLY=1` defined in the environment:
-
- $ cd nginx-1.x.x
- $ export NGX_BROTLI_STATIC_MODULE_ONLY=1
- $ ./configure --add-module=/path/to/ngx_brotli
- $ make && make install
-
## Configuration directives
### `brotli_static`
diff --git a/WORKSPACE b/WORKSPACE
index 902b2dd..5c6c510 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -25,16 +25,11 @@
workspace(name = "ngx_brotli")
git_repository(
- name = "io_brotli",
- commit = "e7f47b94709ee4991b49103e6ada78a24d950893", # 2016-08-24
+ name = "org_brotli",
+ commit = "5db62dcc9d386579609540cdf8869e95ad334bbd", # 2016-11-09
remote = "https://github.com/google/brotli.git",
)
-bind(
- name = "brotli_enc",
- actual = "@io_brotli//:brotli_enc",
-)
-
git_repository(
name = "nginx",
commit = "2a881edaa3e60c9392e90efe9f6bfc25024e6e3c", # 2016-08-23
diff --git a/config b/config
index 8b240c5..64a1448 100644
--- a/config
+++ b/config
@@ -24,191 +24,149 @@
ngx_addon_name=ngx_brotli
-#
-# static module (no dependencies)
-#
+if [ -z "$ngx_module_link" ]; then
+cat << END
-if [ -n "$ngx_module_link" ]; then
- # nginx-1.9.11+
- 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=
+$0: error: Brotli module requires recent version of NGINX (1.9.11+).
- . auto/module
-else
- HTTP_MODULES="$HTTP_MODULES \
- ngx_http_brotli_static_module"
-
- NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
- $ngx_addon_dir/src/ngx_http_brotli_static_module.c"
+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
-if [ -n "$NGX_BROTLI_STATIC_MODULE_ONLY" ]; then
- return
-fi
-
#
-# filter module (depends on Brotli library)
+# HTTP filter module with Brotli library
#
-# <brotli/encode.h>
+brotli="$ngx_addon_dir/deps/brotli"
-ngx_feature_name=
-ngx_feature_run=no
-ngx_feature_incs="#include <brotli/encode.h>"
-ngx_feature_test="BrotliEncoderCreateInstance(NULL, NULL, NULL)"
+if [ ! -f "$brotli/include/brotli/encode.h" ]; then
+cat << END
-# auto-discovery
-ngx_feature="Brotli library"
-ngx_feature_path=
-ngx_feature_libs="-lbrotlienc -lm"
-. auto/feature
+$0: error: \
+Brotli library is missing from the $brotli directory.
-if [ $ngx_found = no ]; then
- # FreeBSD, OpenBSD
- ngx_feature="Brotli library in /usr/local/"
- ngx_feature_path="/usr/local/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/usr/local/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
+Please make sure that the git submodule has been checked out:
-if [ $ngx_found = no ]; then
- # NetBSD
- ngx_feature="Brotli library in /usr/pkg/"
- ngx_feature_path="/usr/pkg/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
+ cd $ngx_addon_dir && git submodule update --init && cd $PWD
-if [ $ngx_found = no ]; then
- # MacPorts
- ngx_feature="Brotli library in /opt/local/"
- ngx_feature_path="/opt/local/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/opt/local/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
-
-# <brotli/enc/encode.h>
-
-if [ $ngx_found = no ]; then
- ngx_feature_name=NGX_HAVE_BROTLI_ENC_ENCODE_H
- ngx_feature_run=no
- ngx_feature_incs="#include <brotli/enc/encode.h>"
- ngx_feature_test="BrotliEncoderCreateInstance(NULL, NULL, NULL)"
-
- # auto-discovery
- ngx_feature="Brotli library"
- ngx_feature_path=
- ngx_feature_libs="-lbrotlienc -lm"
- . auto/feature
-fi
-
-if [ $ngx_found = no ]; then
- # FreeBSD, OpenBSD
- ngx_feature="Brotli library in /usr/local/"
- ngx_feature_path="/usr/local/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/usr/local/lib -L/usr/local/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/usr/local/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
-
-if [ $ngx_found = no ]; then
- # NetBSD
- ngx_feature="Brotli library in /usr/pkg/"
- ngx_feature_path="/usr/pkg/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/usr/pkg/lib -L/usr/pkg/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/usr/pkg/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
-
-if [ $ngx_found = no ]; then
- # MacPorts
- ngx_feature="Brotli library in /opt/local/"
- ngx_feature_path="/opt/local/include"
- if [ $NGX_RPATH = YES ]; then
- ngx_feature_libs="-R/opt/local/lib -L/opt/local/lib -lbrotlienc -lm"
- else
- ngx_feature_libs="-L/opt/local/lib -lbrotlienc -lm"
- fi
- . auto/feature
-fi
-
-if [ $ngx_found = no ]; then
- echo "$0: error: ngx_brotli filter module requires Brotli library."
+END
exit 1
fi
-if [ $HTTP_GZIP = YES ]; then
- next=ngx_http_gzip_filter_module
-elif echo $HTTP_FILTER_MODULES | grep ngx_pagespeed_etag_filter >/dev/null; then
- next=ngx_pagespeed_etag_filter
-else
- next=ngx_http_range_header_filter_module
-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"
-if [ -n "$ngx_module_link" ]; then
- # nginx-1.9.11+
- ngx_module_type=HTTP_FILTER
- ngx_module_name=ngx_http_brotli_filter_module
- ngx_module_incs="$ngx_feature_path"
- ngx_module_deps=
- ngx_module_srcs="$ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
- ngx_module_libs="$ngx_feature_libs"
- 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"
+. auto/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 [ $ngx_module_link != DYNAMIC ]; then
- # ngx_module_order doesn't work with static modules,
- # so we must re-order filters here.
- HTTP_FILTER_MODULES=`echo $HTTP_FILTER_MODULES \
- | sed "s/$ngx_module_name//" \
- | sed "s/$next/$next $ngx_module_name/"`
+ 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
-else
- CORE_INCS="$CORE_INCS $ngx_feature_path"
- CORE_LIBS="$CORE_LIBS $ngx_feature_libs"
HTTP_FILTER_MODULES=`echo $HTTP_FILTER_MODULES \
- | sed "s/$next/$next ngx_http_brotli_filter_module/"`
-
- NGX_ADDON_SRCS="$NGX_ADDON_SRCS \
- $ngx_addon_dir/src/ngx_http_brotli_filter_module.c"
+ | 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
diff --git a/deps/brotli b/deps/brotli
new file mode 160000
index 0000000..5db62dc
--- /dev/null
+++ b/deps/brotli
@@ -0,0 +1 @@
+Subproject commit 5db62dcc9d386579609540cdf8869e95ad334bbd