主要观点: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 找到。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。