Skip to content

Commit

Permalink
Add basic support for Bazel (fmtlib#2505)
Browse files Browse the repository at this point in the history
  • Loading branch information
Vertexwahn authored and PoetaKodu committed Nov 11, 2021
1 parent 018eaaf commit 7b1a89f
Show file tree
Hide file tree
Showing 5 changed files with 117 additions and 0 deletions.
1 change: 1 addition & 0 deletions support/bazel/.bazelrc
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
build --symlink_prefix=/ # Out of source build
1 change: 1 addition & 0 deletions support/bazel/.bazelversion
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
4.2.1
29 changes: 29 additions & 0 deletions support/bazel/BUILD.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
cc_library(
name = "fmt",
srcs = [
#"src/fmt.cc", # No C++ module support
"src/format.cc",
"src/os.cc",
],
hdrs = [
"include/fmt/args.h",
"include/fmt/chrono.h",
"include/fmt/color.h",
"include/fmt/compile.h",
"include/fmt/core.h",
"include/fmt/format.h",
"include/fmt/format-inl.h",
"include/fmt/locale.h",
"include/fmt/os.h",
"include/fmt/ostream.h",
"include/fmt/printf.h",
"include/fmt/ranges.h",
"include/fmt/xchar.h",
],
includes = [
"include",
"src",
],
strip_include_prefix = "include",
visibility = ["//visibility:public"],
)
85 changes: 85 additions & 0 deletions support/bazel/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
# Bazel support

Bazel is an open-source build tool.
More information about Bazel can be found [here](https://bazel.build/).

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

```python
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}:

```python
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`:

```C++
#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:

```python
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).
1 change: 1 addition & 0 deletions support/bazel/WORKSPACE.bazel
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
workspace(name = "fmt")

0 comments on commit 7b1a89f

Please sign in to comment.