欢迎光临散文网 会员登陆 & 注册

Carbon Language

2023-02-18 19:27 作者:紧果呗  | 我要投稿

 🟡 Carbon Language


Google 新推出 Carbon 语言,闻要成为 C++ 的接班人,基于 LLVM 现代编译器框架开发。这么利害,那么就来学一下这种语言使用的默认构建工具,Bazel,这是大型项目的构建工具,快速、高效,只编译需要构建的文件,支持多种语言。单一可执行文件,自动下载依赖工具。可根据项目需要伸缩、扩展。


C++ 引入外部依赖的方式可以大致分为两类:二进制依赖,或源码依赖。前者有 ABI 兼容问题,不支持更换平台或系统,所有的二进制文件都需要为不同平台重新编译;后者的缺点是,第一次构建的时候需要编译所有代码,比较耗时。Google 推崇第二种依赖方式,所以才会那么在乎 Bazel 的编译速度。


    A rule is a function, and a target is a function call


Bazel 规则(Rule)就是一个函数,BUILD 脚本文件中可以直接使用,这是 Python 脚本的简化版。内置规则有 genrule、cc_binary、cc_library、java_binary、py_library 等等,Target 就是调用规则,并且相应产生输出。


规则 rule 也是函数,拥有函数的大部分特性,但相比函数,受到了更多的约束。比如 load 是函数但不是规则,load 用于从其他文件载入规则,load 不能用于规则中。又如 glob 是函数,用于查找与路径规则匹配的文件。


[Action Graph](https://u98yad7iy.oss-cn-shanghai.aliyuncs.com/imgsbed/2021/11/05/10-27-23-bazel_out-177ed5b6632.jpg)


Bazel 的执行分为三个阶段:

  •  **Loading**,加载 Bazel 脚本文件,WORKSPACE、BUILD、bzl 文件;

  •  **Analysis**,解析所有脚本并生成 Action Graph。解析过程包含外部资源下载,本地资源准备等;

  •  **Execution**,执行 Action Graph 以生成目标文件;


动作(action)是 Bazel 中最小的执行单元,一般用于将输入文件转换为合适的输出文件,比如将 C/C++ 文件转换为 .o 或 .a 文件。动作可以没有输入文件,但至少有一个输出文件。BUILD 脚本中一个 target 对应一个或多个动作,Bazel 会自动将 target 解析为动作并在执行阶段执行。


Action Graph 执行过程中,由动作生成的目标文件会被集中缓存。再次编译时,只有依赖文件被修改的目标才会被更新,这一点和 CMake 一致。Bazel 可以设置远程缓存与分布式编译环境。


Bazel 编译生成的缓存文件一般保存在项目目录下以 bazel-* 为名称的目录下,所以尽量不要在项目中创建类似名称的文件夹,避免和缓存文件夹冲突。



Bazel 官方代码仓库包含了文档和示范用例,整个工程包含多个 BUILD 脚本,项目工作目录顶层向子目录深入,例如 example/cpp 目录包含的 C++ 演示案例。这些脚本就是 Python 脚本的简化版:

Bazel 称工程中的子目录为 package,例如 example 目录下的 BUILD 脚本定义其为 public:

可以使用 query 查询工程子目录下的构建配置信息。然后,执行 build 或 test 进行构建或测试。指定构建目标,指定 target 是 BUILD 配置的各种库、程序目标的 name 属性内容。可以包含完整的项目目录路径,以斜杠开头,路径后跟冒号接 target 名称。如果在 target 的所在目录,也可以省略路径信息:

Carbon 语言当前的实现称为 Explorer,官方提供在线体验网站,它是基于 LLVM 现代编译器框架开发的一个前端编译器,按以下操作可以从源代码编译:

本地已经安装 LLVM 编译器的情况下,Bazel 还会根据配置文件下载和配置 llvm-project。这可能由于网络不畅通而不能下载到依赖工具,从而导致编译失败。需要手动解决,安装 LLVM Project 到提示的目录下:

llvm-raw 目录下存放的是下载好的 llvm-project 仓库原始文件,使用它时会复制到需要的位置使用。获取 LLVM 工具的过程中,会使用到 llvm-project-overlay 创建目录链接,将原始文件链接到工作目录。目前稳定版 Bazel 6.0.0,如果使用 Nightly 版本,可能导致以上错误。


可以尝试深度清理缓存文件:


    bazel clean --expunge


输出的错误信息显示,在 llvm-project-overlay 链接目录时遇到有目录冲突,可以是 Windows 平台下兼容问题没处理好,对 llvm-raw/utils/bazel/overlay_directories.py 做一下小手术,添加目录存在与否的条件判断,避免对已经存在的目录做链接:

但还是不行,目前 Windows 系统上体验 Carbon 只能进入 WSL 系统。


参考

  • - [Carbon programming language](https://github.com/carbon-language/carbon-lang)

  • - [Compiler Explorer](https://carbon.compiler-explorer.com)

  • - [Bazel - Build and test tool](https://github.com/bazelbuild/bazel)

  • - [The LLVM Project](https://github.com/llvm/llvm-project)

  • - [Bazel vs. CMake](https://yearn.xyz/posts/tools/bazelcmake/)

  • - [Building on Windows](https://github.com/carbon-language/carbon-lang/issues/298)



Carbon Language的评论 (共 条)

分享到微博请遵守国家法律