1335 文字
7 分
tree-sitterのビルドが失敗する — 犯人はLazyVimではなくmacOSのベータSDKだった

この記事が扱う症状#

以下のいずれかに心当たりがある人向けです。

  • Neovim / LazyVim で tree-sitter のパーサーがビルドできない
  • nvim の画面に Error during "tree-sitter build" と出る
  • ビルドを手で再現すると ld: tapi error: malformed file が出る
  • libSystem.B.tbd:4:20: error: unknown architecture が出る
  • xcrun --show-sdk-path が、使っている macOS より新しいバージョンの SDK を返す

結論だけ先に書くと、Command Line Tools に次期OS向けのベータSDKが紛れ込んでいるのが原因です。消せば直ります。

新しいMacで、いきなり詰まった#

新しい MacBook Pro が届いた日のことです。会社で使っている dotfiles を持ち込んで、Homebrew で nvim を入れ、~/.config/nvim に設定を置いて起動しました。

LazyVim がプラグインを取りに行き、tree-sitter のパーサーをビルドし始めた、そこで止まりました。yaml のパーサーがビルドできない。

新しいマシンで設定を移したばかりです。真っ先に疑うのは自分の設定でしょう。dotfiles の移し方を間違えたか、nvim のバージョンが違うか、LazyVim が新しい nvim に追いついていないか。実際、私も最初はそう思いました。

結論から書くと、全部ハズレでした。

エラーの中身#

パーサーのビルドを手で再現してみると、こう出ました。

ld: tapi error: malformed file
/Library/Developer/CommandLineTools/SDKs/MacOSX27.0.sdk/usr/lib/libSystem.B.tbd:4:20: error: unknown architecture
clang: error: linker command failed with exit code 1

ここに nvim も LazyVim も tree-sitter も出てきません。出てくるのは ld、つまりリンカです。C のコードを繋いで実行可能な形にする、コンパイラの最終工程。そこが転んでいる。

ということは、これは nvim の問題ではなく、このMacでCのコンパイルが通らないという問題です。tree-sitter はたまたま C をコンパイルするから巻き込まれただけで、被害者にすぎません。

真犯人#

SDK の置き場を覗いて、犯人が見つかりました。

$ ls /Library/Developer/CommandLineTools/SDKs/
MacOSX15.4.sdk
MacOSX26.5.sdk
MacOSX27.0.sdk     ← ???

SDK というのは、macOS 向けにコンパイルするための部品一式です。ヘッダファイルとライブラリの定義が入っていて、OS のバージョンごとに置かれます。

このマシンの macOS は 26.6.2。なのに 27.0 の SDK が居ます。まだ世に出ていないバージョンです。日付を見ると 8/31 でした。

問題はここからです。xcrun一番バージョンの高い SDK を自動的に選びます

$ xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX27.0.sdk

27.0 が一つ居るだけで、このマシンの C コンパイルは全部そっちを向く。ところが Command Line Tools 本体のバージョンは 26.6.0 で、その中のリンカは 27.0 の .tbd ファイル(ライブラリの定義を書いたテキスト形式のファイル)を解釈できません。それが tapi error: malformed fileunknown architecture の正体でした。

未来の部品に、現在の工具を当てていた。 噛み合うはずがありません。

決め手は、ログに残っていない情報だった#

面白かったのはこの後です。

原因は分かった。しかし「なぜ次期OSのSDKがここに居るのか」は、マシンを調べても分かりませんでした。インストール履歴を追っても決定的なことは出てこない。

決め手になったのは、私の記憶でした。

さっき、ダウンロードしたかもしれない

新しい Mac が来て浮かれて、あちこちから色々入れていたのです。そのどれかがベータの Command Line Tools を連れてきていた。

これ、どれだけログを漁っても出てこない情報です。「そういえばさっき何か入れた気がする」は、本人の頭の中にしかない。エラーメッセージの読解は外注できても、これだけは外注できません。

直し方#

ベータSDKを消して、シンボリックリンクも一緒に片付けます。

sudo rm -rf /Library/Developer/CommandLineTools/SDKs/MacOSX27.0.sdk \
            /Library/Developer/CommandLineTools/SDKs/MacOSX27.sdk

消した後、xcrun が正気に戻りました。

$ xcrun --show-sdk-path
/Library/Developer/CommandLineTools/SDKs/MacOSX.sdk
$ xcrun --show-sdk-version
26.5

この状態で tree-sitter のビルドを流すと、あっさり通りました。LazyVim 側は何も触っていません。

教訓#

エラーメッセージに出てくる登場人物を見る。 今回 ldSDK は出てきましたが、nvimlazy.nvim も一度も出てきませんでした。それなのに「LazyVim が壊れた」と思い込んでいた。出てこないものを疑って時間を溶かすのは、よくある失敗です。

新しいMacほど、環境が汚れていないとは限らない。 むしろ届いた初日にあれこれ入れるので、身に覚えのないものが紛れ込むのはこのタイミングです。

xcrun --show-sdk-path は、Macでビルドが謎に転んだ時の最初の一手として覚えておく価値があります。 一行で「今どの部品を使おうとしているか」が分かります。

ちなみにこの切り分け、全部で10分ほどでした。自力でやっていたら、まず LazyVim の設定を疑い、nvim を入れ直し、Homebrew を疑い、半日は溶かしていたと思います。

tree-sitterのビルドが失敗する — 犯人はLazyVimではなくmacOSのベータSDKだった
https://oranges-blog.netlify.app/posts/treesitter-build-failure-beta-sdk/
作者
orangeVaper
公開日
2026-09-14
ライセンス
CC BY-NC-SA 4.0