Rust/C/C++ 混合构建 - 用Bazel构建Rust与C

Bazel是什么

Bazel 是一个类似于 Make、Maven 和 Gradle 的开源构建和测试工具。 它使用人类可读的高级 build 语言。Bazel 支持 并针对多个平台构建输出。Bazel 支持 多个代码库和大量用户的大型代码库。

优势

Bazel 具有以下优势:

  • 高级 build 语言。Bazel 使用直观易懂的 用于描述项目的构建属性 语义级别。与其他工具不同,Bazel 基于概念 库、二进制文件、脚本和数据集,保护您免受 编写单个调用所需的复杂程度,例如编译器和 链接程序。
  • Bazel 既快速又可靠。 Bazel 会缓存之前完成的所有工作 会跟踪文件内容和构建命令的更改。这样,Bazel 知道何时需要重新构建,并仅进行重建。要进一步 您可以快速设置项目,以便在高度云环境中 并行和增量方式。
  • Bazel 是多平台的。 Bazel 可在 Linux、macOS 和 Windows 上运行。Bazel 可以为多个平台(包括 桌面设备、服务器和移动设备。
  • Bazel 扩缩能力。 Bazel 在处理超过 10 万项的构建时,能够保持敏捷性 源文件。它适用于多个代码库和数十个用户群 成千上万个。
  • Bazel 具有可扩展性。 许多语言 而您可以扩展 Bazel 来支持 框架。

安装

https://bazel.build/install/unbuntu

使用 rules_rust

rules_rust: https://bazelbuild.github.io/rules_rust/index.html

rules_rust 定义了一组构建Rust语言的规则,比如rust_binary, rust_static_library等

Playgroud

基于之前的my-project项目,我们改用bazel来构建。

  • 在my-project目录下新建WORKSPACE文件,并写入
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")

# To find additional information on this release or newer ones visit:
# https://github.com/bazelbuild/rules_rust/releases
http_archive(
    name = "rules_rust",
    integrity = "sha256-Weev1uz2QztBlDA88JX6A1N72SucD1V8lBsaliM0TTg=",
    urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.48.0/rules_rust-v0.48.0.tar.gz"],
)

load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")

rules_rust_dependencies()

rust_register_toolchains(
    edition = "2021",
    versions = [
        "1.79.0"
    ],
)

从rules_rust规则集导入rules_rust_dependencies, rust_register_toolchains, 前者用来处理rust的依赖,后者则是定义了rust工具链。

  • 新创建MODULE.bazel并写入

bazel_dep(name = "rules_rust", version = "0.48.0")
  • 现在就可以rules_rust来编写构建任务了,bazel定义构建任务以软件包为粒度,在src目录下创建BUILD.bazel并写入
load("@rules_cc//cc:defs.bzl", "cc_library")
load("@rules_rust//rust:defs.bzl", "rust_binary")

rust_binary(
    name = "main",
    srcs = ["main.rs"],
    deps = [":greet"],
)

cc_library(
    name = "greet",
    srcs = ["greet.c"],
)

配置一切就绪,现在可以构建了

$ bazel run //src:main                                                
INFO: Analyzed target //src:main (151 packages loaded, 1341 targets configured).
INFO: Found 1 target...
Target //src:main up-to-date:
  bazel-bin/src/main
INFO: Elapsed time: 5.184s, Critical Path: 2.17s
INFO: 114 processes: 108 internal, 6 linux-sandbox.
INFO: Build completed successfully, 114 total actions
INFO: Running command line: bazel-bin/src/main
Hello, world!

//src:main src是指软件包,一般指目录下有BUILD.bazel的目录,main则是BUILD.bazel定义的构建任务,具体见https://bazel.build/concepts/labels?hl=zh-cn

posted @ 2025-09-25 19:20  yihailin  阅读(27)  评论(0)    收藏  举报