From d9a731d4862891f274b63cef14bde0e5558a290f Mon Sep 17 00:00:00 2001 From: Vertexwahn Date: Fri, 24 Sep 2021 22:17:26 +0200 Subject: [PATCH] Add basic support for Bazel (#2505) --- support/bazel/.bazelrc | 1 + support/bazel/.bazelversion | 1 + support/bazel/BUILD.bazel | 29 ++++++++++++ support/bazel/README.md | 85 +++++++++++++++++++++++++++++++++++ support/bazel/WORKSPACE.bazel | 1 + 5 files changed, 117 insertions(+) create mode 100644 support/bazel/.bazelrc create mode 100644 support/bazel/.bazelversion create mode 100644 support/bazel/BUILD.bazel create mode 100644 support/bazel/README.md create mode 100644 support/bazel/WORKSPACE.bazel diff --git a/support/bazel/.bazelrc b/support/bazel/.bazelrc new file mode 100644 index 00000000..583cbbd2 --- /dev/null +++ b/support/bazel/.bazelrc @@ -0,0 +1 @@ +build --symlink_prefix=/ # Out of source build diff --git a/support/bazel/.bazelversion b/support/bazel/.bazelversion new file mode 100644 index 00000000..fae6e3d0 --- /dev/null +++ b/support/bazel/.bazelversion @@ -0,0 +1 @@ +4.2.1 diff --git a/support/bazel/BUILD.bazel b/support/bazel/BUILD.bazel new file mode 100644 index 00000000..3380bbca --- /dev/null +++ b/support/bazel/BUILD.bazel @@ -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"], +) diff --git a/support/bazel/README.md b/support/bazel/README.md new file mode 100644 index 00000000..ae5aded6 --- /dev/null +++ b/support/bazel/README.md @@ -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//fmt", # replace 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). diff --git a/support/bazel/WORKSPACE.bazel b/support/bazel/WORKSPACE.bazel new file mode 100644 index 00000000..5be77811 --- /dev/null +++ b/support/bazel/WORKSPACE.bazel @@ -0,0 +1 @@ +workspace(name = "fmt")