| # Bazel |
| |
| Google Benchmark provides Bazel targets for both the benchmark library and the |
| optional default `main` function: |
| |
| * `@google_benchmark//:benchmark` provides the benchmark library. |
| * `@google_benchmark//:benchmark_main` provides the default `main` function and |
| depends on `@google_benchmark//:benchmark`. |
| |
| Use `@google_benchmark//:benchmark` when the benchmark target defines its own |
| `main` function, including through `BENCHMARK_MAIN()`. Use |
| `@google_benchmark//:benchmark_main` when the benchmark target should use the |
| default Google Benchmark entry point. |
| |
| ## Bzlmod |
| |
| With Bzlmod enabled, add Google Benchmark to your `MODULE.bazel` file: |
| |
| ```starlark |
| bazel_dep(name = "google_benchmark", version = "<VERSION>") |
| ``` |
| |
| Replace `<VERSION>` with the Google Benchmark release version you want to use. |
| |
| Then depend on the Bazel target from a `cc_binary` or `cc_test`: |
| |
| ```starlark |
| load("@rules_cc//cc:defs.bzl", "cc_binary") |
| |
| cc_binary( |
| name = "string_benchmark", |
| srcs = ["string_benchmark.cc"], |
| deps = ["@google_benchmark//:benchmark_main"], |
| ) |
| ``` |
| |
| The source file should register benchmarks, but it should not call |
| `BENCHMARK_MAIN()` when linking against `@google_benchmark//:benchmark_main`: |
| |
| ```c++ |
| #include <benchmark/benchmark.h> |
| #include <string> |
| |
| static void BM_StringCreation(benchmark::State& state) { |
| for (auto _ : state) { |
| std::string empty_string; |
| } |
| } |
| BENCHMARK(BM_StringCreation); |
| ``` |
| |
| Run the benchmark with Bazel: |
| |
| ```bash |
| bazel run //:string_benchmark |
| ``` |
| |
| Pass Google Benchmark flags after Bazel's `--` separator: |
| |
| ```bash |
| bazel run //:string_benchmark -- --benchmark_filter=StringCreation |
| ``` |
| |
| ## WORKSPACE |
| |
| Projects that still use `WORKSPACE` can declare Google Benchmark as an external |
| repository and load its dependencies from `bazel/benchmark_deps.bzl`: |
| |
| ```starlark |
| load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive") |
| |
| http_archive( |
| name = "google_benchmark", |
| strip_prefix = "benchmark-<VERSION>", |
| urls = ["https://github.com/google/benchmark/archive/refs/tags/v<VERSION>.tar.gz"], |
| # Add sha256 for reproducible builds. |
| ) |
| |
| load("@google_benchmark//:bazel/benchmark_deps.bzl", "benchmark_deps") |
| |
| benchmark_deps() |
| ``` |
| |
| Use the same `<VERSION>` value without the leading `v`; the archive URL adds the tag prefix explicitly. |
| |
| After declaring the repository, use the same target labels shown above: |
| `@google_benchmark//:benchmark` or `@google_benchmark//:benchmark_main`. |
| |
| ## Perf Counters |
| |
| When using Bazel, enable libpfm support by adding `--define pfm=1` to the build |
| or run command. See [Perf Counters](perf_counters.md) for more details.
|