# Copyright 2023 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:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * 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.
#     * Neither the name of Google Inc. nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS 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 COPYRIGHT
# OWNER 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("@bazel_skylib//rules:expand_template.bzl", "expand_template")
load("@bazel_skylib//rules:write_file.bzl", "write_file")
load("@rules_cc//cc:cc_library.bzl", "cc_library")
load("@rules_cc//cc:cc_test.bzl", "cc_test")

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

exports_files([
    "COPYING",
    "COPYING.notestdata",
])

SNAPPY_VERSION = (1, 2, 2)

config_setting(
    name = "windows",
    constraint_values = ["@platforms//os:windows"],
)

cc_library(
    name = "config",
    hdrs = ["config.h"],
    defines = ["HAVE_CONFIG_H"],
)

cc_library(
    name = "snappy-stubs-public",
    hdrs = [":snappy-stubs-public.h"],
)

cc_library(
    name = "snappy-stubs-internal",
    srcs = ["snappy-stubs-internal.cc"],
    hdrs = ["snappy-stubs-internal.h"],
    implementation_deps = [
        ":config",
    ],
    deps = [
        ":snappy-stubs-public",
    ],
)

cc_library(
    name = "snappy",
    srcs = [
        "snappy.cc",
        "snappy-internal.h",
        "snappy-sinksource.cc",
    ],
    hdrs = [
        "snappy.h",
        "snappy-sinksource.h",
    ],
    copts = select({
        ":windows": [],
        "//conditions:default": [
            "-Wno-sign-compare",
        ],
    }),
    implementation_deps = [
        ":config",
    ],
    deps = [
        ":snappy-stubs-internal",
        ":snappy-stubs-public",
    ],
)

cc_library(
    name = "snappy-c",
    srcs = ["snappy-c.cc"],
    hdrs = ["snappy-c.h"],
    deps = [":snappy"],
)

filegroup(
    name = "testdata",
    srcs = glob(["testdata/*"]),
)

cc_library(
    name = "snappy-test",
    testonly = True,
    srcs = [
        "snappy-test.cc",
        "snappy_test_data.cc",
    ],
    hdrs = [
        "snappy-test.h",
        "snappy_test_data.h",
    ],
    deps = [":snappy-stubs-internal"],
)

cc_test(
    name = "snappy_benchmark",
    srcs = ["snappy_benchmark.cc"],
    data = [":testdata"],
    deps = [
        ":snappy",
        ":snappy-test",
        "@com_google_benchmark//:benchmark_main",
    ],
)

cc_test(
    name = "snappy_unittest",
    srcs = [
        "snappy_unittest.cc",
    ],
    data = [":testdata"],
    deps = [
        ":snappy",
        ":snappy-test",
        "@com_google_googletest//:gtest_main",
    ],
)

# Generate a config.h similar to what cmake would produce.
write_file(
    name = "config_h",
    out = "config.h",
    content = """\
#define HAVE_STDDEF_H 1
#define HAVE_STDINT_H 1
#ifdef __has_builtin
#  if !defined(HAVE_BUILTIN_EXPECT) && __has_builtin(__builtin_expect)
#    define HAVE_BUILTIN_EXPECT 1
#  endif
#  if !defined(HAVE_BUILTIN_CTZ) && __has_builtin(__builtin_ctzll)
#    define HAVE_BUILTIN_CTZ 1
#  endif
#  if !defined(HAVE_BUILTIN_PREFETCH) && __has_builtin(__builtin_prefetech)
#    define HAVE_BUILTIN_PREFETCH 1
#  endif
#elif defined(__GNUC__) && (__GNUC__ > 3 || __GNUC__ == 3 && __GNUC_MINOR__ >= 4)
#  ifndef HAVE_BUILTIN_EXPECT
#    define HAVE_BUILTIN_EXPECT 1
#  endif
#  ifndef HAVE_BUILTIN_CTZ
#    define HAVE_BUILTIN_CTZ 1
#  endif
#  ifndef HAVE_BUILTIN_PREFETCH
#    define HAVE_BUILTIN_PREFETCH 1
#  endif
#endif

#if defined(_WIN32) && !defined(HAVE_WINDOWS_H)
#define HAVE_WINDOWS_H 1
#endif

#ifdef __has_include
#  if !defined(HAVE_BYTESWAP_H) && __has_include(<byteswap.h>)
#    define HAVE_BYTESWAP_H 1
#  endif
#  if !defined(HAVE_UNISTD_H) && __has_include(<unistd.h>)
#    define HAVE_UNISTD_H 1
#  endif
#  if !defined(HAVE_SYS_ENDIAN_H) && __has_include(<sys/endian.h>)
#    define HAVE_SYS_ENDIAN_H 1
#  endif
#  if !defined(HAVE_SYS_MMAN_H) && __has_include(<sys/mman.h>)
#    define HAVE_SYS_MMAN_H 1
#  endif
#  if !defined(HAVE_SYS_UIO_H) && __has_include(<sys/uio.h>)
#    define HAVE_SYS_UIO_H 1
#  endif
#  if !defined(HAVE_SYS_TIME_H) && __has_include(<sys/time.h>)
#    define HAVE_SYS_TIME_H 1
#  endif
#endif

#ifndef SNAPPY_IS_BIG_ENDIAN
#  ifdef __s390x__
#    define SNAPPY_IS_BIG_ENDIAN 1
#  elif defined(__BYTE_ORDER__) && defined(__ORDER_BIG_ENDIAN__) && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__
#    define SNAPPY_IS_BIG_ENDIAN 1
#  endif
#endif
""".splitlines(),
)

expand_template(
    name = "snappy_stubs_public_h",
    out = "snappy-stubs-public.h",
    substitutions = {
        "${HAVE_SYS_UIO_H_01}": "!_WIN32",
        "${PROJECT_VERSION_MAJOR}": str(SNAPPY_VERSION[0]),
        "${PROJECT_VERSION_MINOR}": str(SNAPPY_VERSION[1]),
        "${PROJECT_VERSION_PATCH}": str(SNAPPY_VERSION[2]),
    },
    template = "snappy-stubs-public.h.in",
)
