# 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.

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

licenses(["notice"])

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"],
    deps = [
        ":config",
        ":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",
        ],
    }),
    deps = [
        ":config",
        ":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.
genrule(
    name = "config_h",
    outs = ["config.h"],
    cmd = """cat <<EOF >$@
#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
EOF
""",
)

genrule(
    name = "snappy_stubs_public_h",
    srcs = ["snappy-stubs-public.h.in"],
    outs = ["snappy-stubs-public.h"],
    # Assume sys/uio.h is available on non-Windows.
    # Set the version numbers.
    cmd = ("""sed -e 's/$${HAVE_SYS_UIO_H_01}/!_WIN32/g' \
           -e 's/$${PROJECT_VERSION_MAJOR}/%d/g' \
           -e 's/$${PROJECT_VERSION_MINOR}/%d/g' \
           -e 's/$${PROJECT_VERSION_PATCH}/%d/g' \
    $< >$@""" % SNAPPY_VERSION),
)
