使用 Conan 构建一个简单的 Bazel 项目

警告

此示例与 Bazel 6.x 兼容。

在本例中,我们将创建一个 Hello World 程序,它使用最流行的 C++ 库之一:fmt

注意

本示例基于主要的使用 Conan 构建一个简单的 CMake 项目教程。 因此,我们强烈建议在尝试此示例之前阅读它。

在这种情况下,我们将使用 Bazel 作为构建系统和辅助工具,因此您应该在继续此示例之前安装它。 请参阅如何安装 Bazel

请先克隆源代码以重新创建此项目。 您可以在 GitHub 的examples2 存储库中找到它们

$ git clone https://github.com/conan-io/examples2.git
$ cd examples2/examples/tools/google/bazeltoolchain/6_x/string_formatter

我们从一个非常简单的 C++ 语言项目开始,其结构如下

.
├── WORKSPACE
├── conanfile.txt
└── main
    ├── BUILD
    └── demo.cpp

此项目包含一个 *WORKSPACE* 文件,用于加载 Conan 依赖项(在本例中仅为 fmt),以及一个 *main/BUILD* 文件,该文件定义了 *demo* bazel 目标,并且负责使用 fmt 构建一个简单的 Hello World 程序。

让我们看一下每个文件的内容

main/demo.cpp
#include <cstdlib>
#include <fmt/core.h>

int main() {
    fmt::print("{} - The C++ Package Manager!\n", "Conan");
    return EXIT_SUCCESS;
}
WORKSPACE
load("@//conan:dependencies.bzl", "load_conan_dependencies")
load_conan_dependencies()
main/BUILD
cc_binary(
    name = "demo",
    srcs = ["demo.cpp"],
    deps = [
        "@fmt//:fmt"
    ],
)
conanfile.txt
[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* 和 *dependencies.bzl*),这些文件将所有依赖项定义为公共 bazel 目标。 上面的 *WORKSPACE* 已经准备好加载 *dependencies.bzl*,这将告诉 *main/BUILD* 关于 @fmt//:fmt bazel 目标的所有信息。

第一步,我们应该安装 conanfile.txt 中列出的所有依赖项。 命令conan install 不仅安装 fmt 包,而且,如果您的 profile 与 remotes 中预构建的二进制文件不匹配,它还会从源构建它。 此外,它会将 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/6_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
Starting local Bazel server and connecting to it...
INFO: Analyzed target //main:demo (38 packages loaded, 272 targets configured).
INFO: Found 1 target...
INFO: From Linking main/demo:
ld: warning: ignoring duplicate libraries: '-lc++'
Target //main:demo up-to-date:
  bazel-bin/main/demo
INFO: Elapsed time: 60.180s, Critical Path: 7.68s
INFO: 6 processes: 4 internal, 2 darwin-sandbox.
INFO: Build completed successfully, 6 total actions
$ ./bazel-bin/main/demo
Conan - The C++ Package Manager!