この記事が扱う症状
以下のいずれかに心当たりがある人向けです。
- 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.sdk27.0 が一つ居るだけで、このマシンの C コンパイルは全部そっちを向く。ところが Command Line Tools 本体のバージョンは 26.6.0 で、その中のリンカは 27.0 の .tbd ファイル(ライブラリの定義を書いたテキスト形式のファイル)を解釈できません。それが tapi error: malformed file と unknown 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 側は何も触っていません。
教訓
エラーメッセージに出てくる登場人物を見る。 今回 ld と SDK は出てきましたが、nvim も lazy.nvim も一度も出てきませんでした。それなのに「LazyVim が壊れた」と思い込んでいた。出てこないものを疑って時間を溶かすのは、よくある失敗です。
新しいMacほど、環境が汚れていないとは限らない。 むしろ届いた初日にあれこれ入れるので、身に覚えのないものが紛れ込むのはこのタイミングです。
xcrun --show-sdk-path は、Macでビルドが謎に転んだ時の最初の一手として覚えておく価値があります。 一行で「今どの部品を使おうとしているか」が分かります。
ちなみにこの切り分け、全部で10分ほどでした。自力でやっていたら、まず LazyVim の設定を疑い、nvim を入れ直し、Homebrew を疑い、半日は溶かしていたと思います。

