# Copyright (C) 2015-2022 Google LLC
# 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.

load("@nginx//bazel:nginx.bzl", "nginx_copts")
load("@rules_cc//cc:defs.bzl", "cc_binary", "cc_library")

licenses(["notice"])  # BSD license

exports_files(["LICENSE"])

cc_library(
    name = "http_brotli_filter",
    srcs = [
        "src/ngx_http_brotli_filter_module.c",
    ],
    copts = nginx_copts,
    defines = [
        "NGX_HTTP_BROTLI_FILTER",
    ],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "@nginx//:core",
        "@nginx//:http",
        "@org_brotli//:brotlienc",
    ],
)

cc_library(
    name = "http_brotli_static",
    srcs = [
        "src/ngx_http_brotli_static_module.c",
    ],
    copts = nginx_copts,
    defines = [
        "NGX_HTTP_BROTLI_STATIC",
    ],
    visibility = [
        "//visibility:public",
    ],
    deps = [
        "@nginx//:core",
        "@nginx//:http",
    ],
)

cc_binary(
    name = "nginx",
    srcs = [
        "@nginx//:modules",
    ],
    copts = nginx_copts,
    deps = [
        ":http_brotli_filter",
        ":http_brotli_static",
        "@nginx//:core",
    ],
)
