使用 Bazel 构建 LLVM 插件

主要观点:Bazel 的前提是提供可重现、密封的构建,不应依赖主机操作系统上已安装的内容,而构建 LLVM 插件时应链接用户系统上安装的特定版本。作者致力于为插件迁移到 Bazel 以获取其诸多好处,同时需满足插件在不同操作系统版本和 LLVM 版本上工作、链接系统库以及同时支持多个版本等要求。

关键信息:

  • 定义了检测可用 LLVM 版本的方法,通过自定义动态仓库在 MODULE.bazel 中提前定义支持的版本,若主机系统未安装则动态定义。
  • 定义了 LLVM 仓库,根据主机系统上可用的版本动态声明本地 LLVM 仓库,暴露 libLLVM.so 和所需头文件。
  • 定义了插件目标,根据主机操作系统上的可用 LLVM 版本定义插件库。
  • 定义了测试目标,为每个可用的 LLVM 版本定义测试用例,产生多个测试。

重要细节:

  • 检测可用版本的代码中,通过 _is_macos 函数判断是否为 macOS 系统,通过 llvm_path 函数确定 LLVM 路径,_is_supported 函数检查版本是否受支持,_llvm_versions_repo_impl_available_llvm_versions_impl 函数实现相关功能。
  • 定义 LLVM 仓库的代码中,使用 load 加载相关文件,empty_repo 定义空仓库,_llvm_repos_extension 实现动态声明本地仓库的功能。
  • 定义插件目标的代码中,使用 cc_binary 定义插件库,依赖相应的 LLVM 版本。
  • 定义测试目标的代码中,使用 py_test 定义测试用例,包含相关数据和依赖。

最终实现了对插件构建和测试的完全透明和流畅,完整示例可在 https://github.com/AlexDenisov/bazel-llvm-plugin 找到。

阅读 5
0 条评论