目录

如何在Apple Silicon(M1)上编译tree-sitter

1 M1 和 tree-sitter 简介

M1 芯片于2020年11月11日推出,是 Apple 首款专为Mac打造的芯片,拥有格外出色的性能以及令人惊叹的能效表现,也称为 Apple Silicon ,是arm64 架构的个人电脑芯片,在初期通过转译的方式实现了对于X86 结构引用的支持,而在arm 架构的软件上则表现出惊人的能耗比。作为爱好者自然早早入手了一款尝鲜,但因为架构的更换,许多软件都需要做相应的兼容性处理,本文也是这个目的。

tree-sitter 是一个速度很快的语法parser, 支持incremental parsing, error recovery 等功能,属于抽象语法树AST 在编辑器领域的一种应用。

引用官网的一段介绍:

Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited. Tree-sitter aims to be:

  • General enough to parse any programming language
  • Fast enough to parse on every keystroke in a text editor
  • Robust enough to provide useful results even in the presence of syntax errors

Dependency-free so that the runtime library (which is written in pure C) can be embedded in any application

目前已经支持C/C++ Go 等几十种语言. 但官方给的二进制文件是 x86 的, 因此对于 MacBook 的arm 架构是无法使用的, 需要自己编译。本文尝试给出一个可行的解决方案。

2 环境准备

首先先安装一下 Homebrew 。Homebrew是一款软件包管理工具,拥有安装、卸载、更新、查看、搜索等很多实用的功能, “The missing package manager for Macos(or Linux)"。起初在m1 芯片上需要分离环境分别安装 x86 和 arm 架构的homebrew ,经过数个版本的更新,现在已经可以自动处理,使用以下命令即可:

/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"

tree-sitter 依赖 Rust, npm 等环境, 可通过以下命令安装快速安装:

brew install cargo git npm llvm rust

后续的步骤参考了 这个 issue , 但它指出最新的 tree-sitter v0.20存在BUG 问题难以编译成功. 本人测试问题已经解决, 只需稍做修改即可, 因此我们直接选择最新版本:

test -d rust-tree-sitter
# clone 仓库
git clone https://github.com/tree-sitter/tree-sitter rust-tree-sitter
cd rust-tree-sitter && git fetch

如果上述步骤都进行后, 当前目录应该是这样:

3 开始编译

接着, 切换到 cli 目录:

cd cli && cargo install --path .

注意 --path 的后面有一个 . .

这里有一个坑, 如果你像我一样设置了用 GNU/gcc 覆盖了 llvm-gcc, 就需要在 .zshrc 里面注释掉这些代码:

#alias gcc='gcc-11'
#alias cc='gcc-11'
#alias g++='g++-11'
#alias c++='c++-11'

可以通过 gcc --version 来简单确认现在使用的版本, 结果大概是这样:

liuyi@liuyideMacBook-Pro cli % gcc --version
Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/usr/include/c++/4.2.1
Apple clang version 12.0.5 (clang-1205.0.22.9)
Target: arm64-apple-darwin20.6.0
Thread model: posix
InstalledDir: /Library/Developer/CommandLineTools/usr/bin

4 语言编译

接下来的步骤涉及编辑器的实现版本, 我使用的是emacs, 涉及到elisp-tree-sitter 项目, 其他编辑器需要去找类似的版本, 步骤大同小异:

cd PROJECT_DIR_YOU_USE # 这个替换成你的项目路径
file cor/tsc.dyn.dylib | grep -q arm64 || rm-rf core/tsc-dyn.dylib
grep -q LOCAL core/DYN-VERSION || printf LOCAL >core/DYN-VERSION
grep -q DYN-VERSION bin/build && sed -q '/DYN-VERSION/d' bin/build >bin/build.tmp && mv bin/build.tmp bin/build && chmod +x bin/build || :

然后重建 bindings:

EMACS=emacs ./bin/setup && EMACS=emacs ./bin/build

然后把相关文件添加到项目的启动路径就可以了。