From c971b8fe9d2f82cb3e893a6d4bd3107647a14a22 Mon Sep 17 00:00:00 2001
From: fan <yfan3763@gmail.com>
Date: Mon, 24 Oct 2022 06:31:09 +0800
Subject: [PATCH] add bazel build support

Signed-off-by: fan <yfan3763@gmail.com>
---
 BUILD.bazel                 |   9 ++
 README.md                   |   9 ++
 WORKSPACE                   |  33 +++++++
 benchmarks/BUILD.bazel      |  42 ++++++++
 copts.bzl                   |  18 ++++
 db/BUILD.bazel              | 132 +++++++++++++++++++++++++
 helpers/memenv/BUILD.bazel  |  20 ++++
 include/leveldb/BUILD.bazel |   9 ++
 issues/BUILD.bazel          |  41 ++++++++
 port/BUILD.bazel            |  51 ++++++++++
 table/BUILD.bazel           |  38 ++++++++
 util/BUILD.bazel            | 187 ++++++++++++++++++++++++++++++++++++
 12 files changed, 589 insertions(+)
 create mode 100644 BUILD.bazel
 create mode 100644 WORKSPACE
 create mode 100644 benchmarks/BUILD.bazel
 create mode 100644 copts.bzl
 create mode 100644 db/BUILD.bazel
 create mode 100644 helpers/memenv/BUILD.bazel
 create mode 100644 include/leveldb/BUILD.bazel
 create mode 100644 issues/BUILD.bazel
 create mode 100644 port/BUILD.bazel
 create mode 100644 table/BUILD.bazel
 create mode 100644 util/BUILD.bazel

diff --git a/BUILD.bazel b/BUILD.bazel
new file mode 100644
index 0000000..71aaadd
--- /dev/null
+++ b/BUILD.bazel
@@ -0,0 +1,9 @@
+package(default_visibility = ["//visibility:public"])
+
+# default use clang compiler
+config_setting(
+    name = "clang_compiler",
+    flag_values = {
+        "@bazel_tools//tools/cpp:compiler": "clang",
+    },
+)
\ No newline at end of file
diff --git a/README.md b/README.md
index 3088c55..7abe629 100644
--- a/README.md
+++ b/README.md
@@ -49,6 +49,15 @@ Quick start:
 mkdir -p build && cd build
 cmake -DCMAKE_BUILD_TYPE=Release .. && cmake --build .
 ```
+Bazel Support:
+```bash
+# build all
+bazel build "..."
+```
+bazel generate compile_commands.json, this command need python support. and the version can't be too old.
+```bash
+bazel run @hedron_compile_commands//:refresh_all
+```
 
 ### Building for Windows
 
diff --git a/WORKSPACE b/WORKSPACE
new file mode 100644
index 0000000..930031e
--- /dev/null
+++ b/WORKSPACE
@@ -0,0 +1,33 @@
+workspace(name = "leveldb")
+
+load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
+load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")
+
+http_archive(
+    name = "com_google_googletest",
+    sha256 = "a1d3123179024258f9c399d45da3e0b09c4aaf8d2c041466ce5b4793a8929f23",
+    strip_prefix = "googletest-86add13493e5c881d7e4ba77fb91c1f57752b3a4",
+    urls = ["https://github.com/google/googletest/archive/86add13493e5c881d7e4ba77fb91c1f57752b3a4.zip"],
+)
+
+http_archive(
+    name = "com_google_benchmark",  # 2021-09-20T09:19:51Z
+    sha256 = "62e2f2e6d8a744d67e4bbc212fcfd06647080de4253c97ad5c6749e09faf2cb0",
+    strip_prefix = "benchmark-0baacde3618ca617da95375e0af13ce1baadea47",
+    urls = ["https://github.com/google/benchmark/archive/0baacde3618ca617da95375e0af13ce1baadea47.zip"],
+)
+
+# generate compile_commands.json
+http_archive(
+    name = "hedron_compile_commands",
+
+    # Replace the commit hash in both places (below) with the latest, rather than using the stale one here. 
+    # Even better, set up Renovate and let it do the work for you (see "Suggestion: Updates" in the README).
+    urls = [
+        "https://github.com/hedronvision/bazel-compile-commands-extractor/archive/af9af15f7bc16fc3e407e2231abfcb62907d258f.tar.gz",
+    ],
+    strip_prefix = "bazel-compile-commands-extractor-af9af15f7bc16fc3e407e2231abfcb62907d258f",
+    # When you first run this tool, it'll recommend a sha256 hash to put here with a message like: "DEBUG: Rule 'hedron_compile_commands' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = ..." 
+)
+load("@hedron_compile_commands//:workspace_setup.bzl", "hedron_compile_commands_setup")
+hedron_compile_commands_setup()
diff --git a/benchmarks/BUILD.bazel b/benchmarks/BUILD.bazel
new file mode 100644
index 0000000..a894022
--- /dev/null
+++ b/benchmarks/BUILD.bazel
@@ -0,0 +1,42 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_test(
+  name = "db_bench",
+  srcs = glob(["db_bench.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+    "@com_google_benchmark//:benchmark_main",
+  ],
+  copts = LEVELDB_FLAGS,
+)
+
+
+cc_test(
+  name = "db_bench_sqlite3",
+  srcs = glob(["db_bench_sqlite3.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+    "@com_google_benchmark//:benchmark_main",
+  ],
+  copts = LEVELDB_FLAGS,
+  linkopts = [
+    "-lsqlite3",
+  ],
+)
+
+cc_test(
+  name = "db_bench_log",
+  srcs = glob(["db_bench_log.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+    "@com_google_benchmark//:benchmark_main",
+  ],
+  copts = LEVELDB_FLAGS,
+)
diff --git a/copts.bzl b/copts.bzl
new file mode 100644
index 0000000..9f04328
--- /dev/null
+++ b/copts.bzl
@@ -0,0 +1,18 @@
+
+LEVELDB_FLAGS = [
+    "-Wall",
+    "-Wextra",
+    "-Wconversion-null",
+    "-Wformat-security",
+    "-Woverlength-strings",
+    "-Wpointer-arith",
+    "-Wundef",
+    "-Wunused-local-typedefs",
+    "-Wunused-result",
+    "-Wvarargs",
+    "-Wvla",
+    "-Wwrite-strings",
+    # "-Werror",
+    "-DNOMINMAX",
+    "-fno-exceptions",
+]
\ No newline at end of file
diff --git a/db/BUILD.bazel b/db/BUILD.bazel
new file mode 100644
index 0000000..1e1a234
--- /dev/null
+++ b/db/BUILD.bazel
@@ -0,0 +1,132 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_library(
+    name = "db_lib",
+    srcs = glob(
+        ["*.cc"],
+        exclude = glob([
+            "*_test.cc",
+            "leveldbutil.cc",
+            "db_bench.cc",
+        ]),
+    ),
+    hdrs = glob([
+        "*.h",
+    ]),
+    deps = [
+        "//include/leveldb",
+        "//table:table_lib",
+        "//util:util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_binary(
+    name = "leveldbutil",
+    srcs = ["leveldbutil.cc"],
+    deps = [
+        ":db_lib",
+        "//include/leveldb",
+        "//util:util_lib",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "autocompact_test",
+    srcs = ["autocompact_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "corruption_test",
+    srcs = ["corruption_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "db_test",
+    srcs = ["db_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "dbformat_test",
+    srcs = ["dbformat_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "fault_injection_test",
+    srcs = ["fault_injection_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "filename_test",
+    srcs = ["filename_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "log_test",
+    srcs = ["log_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "recovery_test",
+    srcs = ["recovery_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "skiplist_test",
+    srcs = ["skiplist_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "version_edit_test",
+    srcs = ["version_edit_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "write_batch_test",
+    srcs = ["write_batch_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "version_set_test",
+    srcs = ["version_set_test.cc"],
+    deps = [":db_lib",
+            "//helpers/memenv:mem_lib"],
+    copts = LEVELDB_FLAGS,
+)
\ No newline at end of file
diff --git a/helpers/memenv/BUILD.bazel b/helpers/memenv/BUILD.bazel
new file mode 100644
index 0000000..78823ba
--- /dev/null
+++ b/helpers/memenv/BUILD.bazel
@@ -0,0 +1,20 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_library(
+  name = "mem_lib",
+  srcs = glob(
+    ["memenv.h",
+     "memenv.cc"],
+  ),
+  hdrs = glob(
+    ["*.h"],
+  ),
+  visibility = ["//visibility:public"],
+  deps = [
+    "//port:port_lib",
+    "//util:leveldb_mutex_lib",
+    "//include/leveldb",
+  ],
+  copts = LEVELDB_FLAGS,
+)
diff --git a/include/leveldb/BUILD.bazel b/include/leveldb/BUILD.bazel
new file mode 100644
index 0000000..3d670bf
--- /dev/null
+++ b/include/leveldb/BUILD.bazel
@@ -0,0 +1,9 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_library(
+    name = "leveldb",
+    hdrs = glob(["*.h"]),
+    include_prefix = "leveldb",
+    copts = LEVELDB_FLAGS,
+)
\ No newline at end of file
diff --git a/issues/BUILD.bazel b/issues/BUILD.bazel
new file mode 100644
index 0000000..1675c4e
--- /dev/null
+++ b/issues/BUILD.bazel
@@ -0,0 +1,41 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_test(
+  name = "issue178_test",
+  srcs = glob(["issue178_test.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//util:util_lib",
+    "//table:table_lib",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+  ],
+  copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+  name = "issue200_test",
+  srcs = glob(["issue200_test.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//util:util_lib",
+    "//table:table_lib",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+  ],
+  copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+  name = "issue320_test",
+  srcs = glob(["issue320_test.cc"]),
+  deps = [
+    "//include/leveldb",
+    "//util:util_lib",
+    "//table:table_lib",
+    "//db:db_lib",
+    "@com_google_googletest//:gtest_main",
+  ],
+  copts = LEVELDB_FLAGS,
+)
\ No newline at end of file
diff --git a/port/BUILD.bazel b/port/BUILD.bazel
new file mode 100644
index 0000000..59c612c
--- /dev/null
+++ b/port/BUILD.bazel
@@ -0,0 +1,51 @@
+package(default_visibility = ["//visibility:public"])
+
+config_setting(
+    name = "osx_x86_64",
+    constraint_values = [
+        "@bazel_tools//platforms:osx",
+        "@bazel_tools//platforms:x86_64",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+config_setting(
+    name = "linux_x86_64",
+    constraint_values = [
+        "@bazel_tools//platforms:linux",
+        "@bazel_tools//platforms:x86_64",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+config_setting(
+    name = "windows_x86_64",
+    constraint_values = [
+        "@bazel_tools//platforms:windows",
+        "@bazel_tools//platforms:x86_64",
+    ],
+    visibility = ["//visibility:public"],
+)
+
+cc_library(
+    name = "port_lib",
+    hdrs = glob(["*.h"]),
+    defines = select({
+        ":osx_x86_64": [
+            "LEVELDB_PLATFORM_POSIX=1",
+            "LEVELDB_IS_BIG_ENDIAN=0",
+        ],
+        ":linux_x86_64": [
+            "LEVELDB_PLATFORM_POSIX=1",
+            "LEVELDB_IS_BIG_ENDIAN=0",
+        ],
+        ":windows_x86_64": [
+            "LEVELDB_PLATFORM_WINDOWS=1",
+            "LEVELDB_IS_BIG_ENDIAN=0",
+        ],
+        "//conditions:default": [
+            "LEVELDB_PLATFORM_posix=1",
+            "LEVELDB_IS_BIG_ENDIAN=0",
+        ],
+    }),
+)
diff --git a/table/BUILD.bazel b/table/BUILD.bazel
new file mode 100644
index 0000000..af3a744
--- /dev/null
+++ b/table/BUILD.bazel
@@ -0,0 +1,38 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_library(
+    name = "table_lib",
+    srcs = glob(
+        ["*.cc"],
+        exclude = glob(["*_test.cc"]),
+    ),
+    hdrs = glob(["*.h"]),
+    deps = [
+        "//include/leveldb",
+        "//util:util_lib",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "table_test",
+    srcs = ["table_test.cc"],
+    deps = [
+        ":table_lib",
+        "//db:db_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "filter_block_test",
+    srcs = ["filter_block_test.cc"],
+    deps = [
+        ":table_lib",
+        "//db:db_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)
diff --git a/util/BUILD.bazel b/util/BUILD.bazel
new file mode 100644
index 0000000..c43716d
--- /dev/null
+++ b/util/BUILD.bazel
@@ -0,0 +1,187 @@
+package(default_visibility = ["//visibility:public"])
+load("//:copts.bzl", "LEVELDB_FLAGS")
+
+cc_library(
+    name = "unix_env_lib",
+    srcs = [
+        "env_posix.cc",
+        "env.cc",
+        "env_posix_test.cc",
+        "env_posix_test_helper.h",
+        "posix_logger.h",
+        "testutil.h",
+        "random.h",
+        "testutil.cc",
+    ],
+    deps = [
+        "//include/leveldb",
+        "//port:port_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_library(
+    name = "windows_env_lib",
+    srcs = select({
+        "//port:windows_x86_64":[
+            "env.cc",
+            "testutil.cc",
+            "random.h",
+            "testutil.h",
+            "env_windows.cc",
+            "env_windows_test.cc",
+            "env_windows_test_helper.h",
+        ],
+        "//conditions:default": [
+            
+        ],
+    }),
+    deps = [
+        "//include/leveldb",
+        "//port:port_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_library(
+    name = "util_lib",
+    srcs = glob(
+        ["*.cc"],
+        exclude = glob(["env*",]),
+    ),
+    hdrs = glob(["*.h"]),
+    linkopts = select({
+        "//port:osx_x86_64": [
+            "-pthread",
+        ],
+        "//port:linux_x86_64": [
+            "-pthread",
+        ],
+        "//port:windows_x86_64": [],
+        "//conditions:default": [],
+    }),
+    deps = select({
+        "//port:windows_x86_64": ["windows_env_lib"],
+        "//port:linux_x86_64": ["unix_env_lib"],
+        "//port:osx_x86_64": ["unix_env_lib"],
+        "//conditions:default": ["unix_env_lib"],
+    }),
+    copts = LEVELDB_FLAGS,
+)
+
+cc_library(
+  name = "leveldb_mutex_lib",
+  srcs = glob(
+    ["mutexlock.h",],
+  ),
+  deps = [
+    "//port:port_lib"
+  ],
+  copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "arena_test",
+    srcs = ["arena_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "bloom_test",
+    srcs = ["bloom_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "cache_test",
+    srcs = ["cache_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "coding_test",
+    srcs = ["coding_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "crc32c_test",
+    srcs = ["crc32c_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "env_posix_test",
+    srcs = ["env_posix_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "env_test",
+    srcs = ["env_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "hash_test",
+    srcs = ["hash_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "logging_test",
+    srcs = ["logging_test.cc"],
+    deps = [":util_lib",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+        ],
+    copts = LEVELDB_FLAGS,
+)
+
+cc_test(
+    name = "status_test",
+    srcs = ["status_test.cc"],
+    deps = [
+        ":util_lib",
+        "//include/leveldb",
+        "//helpers/memenv:mem_lib",
+        "@com_google_googletest//:gtest_main",
+    ],
+    copts = LEVELDB_FLAGS,
+)