fmt/support/bazel/README.md
2021-09-24 13:17:26 -07:00

2.6 KiB

Bazel support

Bazel is an open-source build tool. More information about Bazel can be found here.

Using the fmt repository with Bazel

Even though the {fmt} repository does not contain a WORKSPACE file in its root directory, there is an easy approach to use the {fmt} repository with Bazel out of the box. This is demonstrated in the following example.

Add to your WORKSPACE file:

load("@bazel_tools//tools/build_defs/repo:git.bzl", "new_git_repository")

# Fetch all files from fmt including the BUILD file `support/bazel/BUILD.bazel`
new_git_repository(
    name = "fmt_workaround",
    branch = "master",
    remote = "https://github.com/fmtlib/fmt/",
    build_file_content = "# Empty build file on purpose"
)

# Now the BUILD file `support/bazel/BUILD.bazel` can be used:
new_git_repository(
    name = "fmt",
    branch = "master",
    remote = "https://github.com/fmtlib/fmt/",
    build_file = "@fmt_workaround//:support/bazel/BUILD.bazel"
)

Create a BUILD.bazel file and add a dependency to {fmt}:

cc_binary( # Build a binary
    name = "Demo", # Name of the binary
    srcs = ["main.cpp"], # List of files - we only have main.cpp
    deps = ["@fmt//:fmt"], # Depend on fmt
)

Make use of {fmt} in main.cpp:

#include "fmt/core.h"

int main() {
  fmt::print("The answer is {}.\n", 42);
}

The expected output of this example is The answer is 42.

Bazelize fmt

First downloading a build file and then making use of it can be considered as a bit unclean, nevertheless, it works.

A cleaner Bazel solution would be to move the WORKSPACE and BUILD files to the root folder of the {fmt} Git repository.

In favor of keeping the {fmt} project directory clean, those files were not added to the project root directory.

If you do not like this, you can fork this repository and move the files BUILD.bazel, WORKSPACE.bazel, .bazelrc, and .bazelversion from this folder (support/bazel) to the root folder of this project.

This way {fmt} gets bazelized and can be used in your Bazel builds.

Example

Create a WORKSPACE.bazel file with the following content:

load("@bazel_tools//tools/build_defs/repo:git.bzl", "git_repository")

# Fetch bazelized fmt
git_repository(
    name = "fmt",
    branch = "bazel-support", # A copy of master where BUILD.bazel, WORKSPACE.bazel, .bazelrc and .bazelversion are moved to root
    remote = "https://github.com/<user_or_organisation>/fmt", # replace <user_or_organisation> by a valid account
)

Create a BUILD.bazel file and add a dependency to {fmt} (same as above).

Make use of {fmt} in main.cpp (same as above).