找回密码
 立即注册
首页 业界区 安全 Rust/C/C++ 混合构建 - 用Bazel构建Rust与C

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

丧血槌 2025-9-25 19:23:38
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文件,并写入
  1. load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
  2. # To find additional information on this release or newer ones visit:
  3. # https://github.com/bazelbuild/rules_rust/releases
  4. http_archive(
  5.     name = "rules_rust",
  6.     integrity = "sha256-Weev1uz2QztBlDA88JX6A1N72SucD1V8lBsaliM0TTg=",
  7.     urls = ["https://github.com/bazelbuild/rules_rust/releases/download/0.48.0/rules_rust-v0.48.0.tar.gz"],
  8. )
  9. load("@rules_rust//rust:repositories.bzl", "rules_rust_dependencies", "rust_register_toolchains")
  10. rules_rust_dependencies()
  11. rust_register_toolchains(
  12.     edition = "2021",
  13.     versions = [
  14.         "1.79.0"
  15.     ],
  16. )
复制代码
从rules_rust规则集导入rules_rust_dependencies, rust_register_toolchains,  前者用来处理rust的依赖,后者则是定义了rust工具链。

  • 新创建MODULE.bazel并写入
  1. bazel_dep(name = "rules_rust", version = "0.48.0")
复制代码

  • 现在就可以rules_rust来编写构建任务了,bazel定义构建任务以软件包为粒度,在src目录下创建BUILD.bazel并写入
  1. load("@rules_cc//cc:defs.bzl", "cc_library")
  2. load("@rules_rust//rust:defs.bzl", "rust_binary")
  3. rust_binary(
  4.     name = "main",
  5.     srcs = ["main.rs"],
  6.     deps = [":greet"],
  7. )
  8. cc_library(
  9.     name = "greet",
  10.     srcs = ["greet.c"],
  11. )
复制代码
配置一切就绪,现在可以构建了
  1. $ bazel run //src:main                                                
  2. INFO: Analyzed target //src:main (151 packages loaded, 1341 targets configured).
  3. INFO: Found 1 target...
  4. Target //src:main up-to-date:
  5.   bazel-bin/src/main
  6. INFO: Elapsed time: 5.184s, Critical Path: 2.17s
  7. INFO: 114 processes: 108 internal, 6 linux-sandbox.
  8. INFO: Build completed successfully, 114 total actions
  9. INFO: Running command line: bazel-bin/src/main
  10. Hello, world!
复制代码
//src:main  src是指软件包,一般指目录下有BUILD.bazel的目录,main则是BUILD.bazel定义的构建任务,具体见https://bazel.build/concepts/labels?hl=zh-cn

来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

相关推荐

您需要登录后才可以回帖 登录 | 立即注册