使用 Conan 构建简单的 Bazel 7.x 项目¶
警告
此示例与 Bazel >= 7.1 兼容。
在本示例中,我们将创建一个使用最流行的 C++ 库之一的 Hello World 程序:fmt。
注意
此示例基于 使用 Conan 构建简单的 CMake 项目 教程。因此,我们强烈建议在尝试此示例之前先阅读该教程。
在本例中,我们将使用 Bazel 作为构建系统和辅助工具,因此您应该在继续本示例之前安装它。请参阅 如何安装 Bazel。
请先克隆源代码以重新创建此项目。您可以在 GitHub 上的 examples2 存储库 中找到它们。
$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/tools/google/bazeltoolchain/7_x/string_formatter
我们从一个具有以下结构的非常简单的 C++ 语言项目开始
.
├── MODULE.bazel
├── conanfile.txt
└── main
├── BUILD
└── demo.cpp
此项目包含一个 MODULE.bazel 文件,用于加载 Conan 依赖项(在本例中仅为 fmt
),以及一个 main/BUILD 文件,该文件定义了 demo Bazel 目标,并负责使用 fmt
构建一个简单的 Hello World 程序。
让我们看看每个文件的内容
#include <cstdlib>
#include <fmt/core.h>
int main() {
fmt::print("{} - The C++ Package Manager!\n", "Conan");
return EXIT_SUCCESS;
}
load_conan_dependencies = use_extension("//conan:conan_deps_module_extension.bzl", "conan_extension")
use_repo(load_conan_dependencies, "fmt")
cc_binary(
name = "demo",
srcs = ["demo.cpp"],
deps = [
"@fmt//:fmt"
],
)
[requires]
fmt/10.1.1
[generators]
BazelDeps
BazelToolchain
[layout]
bazel_layout
Conan 使用 BazelToolchain 生成一个 conan_bzl.rc
文件,该文件定义了 conan-config
Bazel 构建配置。此文件和配置作为参数传递给 bazel build
命令。除此之外,Conan 使用 BazelDeps 生成器创建所有 Bazel 文件([DEP]/BUILD.bazel、conan_deps_module_extension.bzl 和 conan_deps_repo_rules.bzl),这些文件定义了规则和创建/加载它们作为 Bazel 存储库的所有依赖项。上面的 MODULE.bazel 已准备好加载 conan_deps_module_extension.bzl 文件,该文件将向 main/BUILD 提供有关 @fmt//:fmt
Bazel 目标的所有信息。
第一步,我们应该安装 conanfile.txt
中列出的所有依赖项。命令 conan install 不仅安装 fmt
包,如果您的配置文件与远程存储库中的预构建二进制文件不匹配,它还会从源代码构建它。此外,它将由 conanfile.txt
中列出的生成器创建的所有文件保存在名为 conan/ 的文件夹中(由 bazel_layout
定义的默认文件夹)。
$ conan install . --build=missing
# ...
======== Finalizing install (deploy, generators) ========
conanfile.txt: Writing generators to /Users/user/develop/examples2/examples/tools/google/bazeltoolchain/7_x/string_formatter/conan
conanfile.txt: Generator 'BazelDeps' calling 'generate()'
conanfile.txt: Generator 'BazelToolchain' calling 'generate()'
conanfile.txt: Generating aggregated env files
conanfile.txt: Generated aggregated env files: ['conanbuild.sh', 'conanrun.sh']
Install finished successfully
现在我们准备好构建和运行我们的应用程序了
$ bazel --bazelrc=./conan/conan_bzl.rc build --config=conan-config //main:demo
Computing main repo mapping:
Loading:
Loading: 0 packages loaded
Analyzing: target //main:demo (1 packages loaded, 0 targets configured)
Analyzing: target //main:demo (1 packages loaded, 0 targets configured)
[0 / 1] [Prepa] BazelWorkspaceStatusAction stable-status.txt
INFO: Analyzed target //main:demo (69 packages loaded, 369 targets configured).
[5 / 7] Compiling main/demo.cpp; 0s darwin-sandbox
INFO: Found 1 target...
Target //main:demo up-to-date:
bazel-bin/main/demo
INFO: Elapsed time: 2.955s, Critical Path: 1.70s
INFO: 7 processes: 5 internal, 2 darwin-sandbox.
INFO: Build completed successfully, 7 total actions
$ ./bazel-bin/main/demo
Conan - The C++ Package Manager!