devbox(Nix)環境でgo installすると発生する「Undefined symbols for architecture arm64」というmacOS特有のエラーはCGO_ENABLED=0を付けると解決するという話をします。
この投稿で学べること
- devbox環境でのGoリンクエラーの原因
- CGO_ENABLEDを使った手っ取り早い解決策
問題: リンクエラーが発生する
devbox(Nix)環境のGoでgo installを実行すると、macOS/arm64で次のようなエラーに遭遇することがあります。
Undefined symbols for architecture arm64:
_SecTrustCopyCertificateChain
このエラーは、cgoがAppleのSecurity.frameworkをリンクしようとする際、Nixのclang-wrapperやSDKとの相性問題で解決できずに発生します。
解決策: CGO_ENABLEDを無効化する
cgoを無効化すると、この問題は解決します。
基本的な使い方
コマンドラインでインストールする場合、次のようにCGO_ENABLED=0を付けて実行します。
CGO_ENABLED=0 go install <package>@<version>
例えば、kustomizeをインストールする場合は次のようになります。
CGO_ENABLED=0 GOBIN=./bin go install sigs.k8s.io/kustomize/kustomize/v5@v5.7.1
Makefileでの対処
Makefile経由でインストールする場合も同様です。
CGO_ENABLED=0 make install
あるいは、ツール取得ターゲットだけcgoを切る方法もあります。
CGO_ENABLED=0 go install sigs.k8s.io/kustomize/kustomize/v5@$(KUSTOMIZE_VERSION)
代替案: devboxのパッケージを直接使う
ビルド自体を避ける方法として、devboxに直接パッケージを追加する選択肢もあります。
例えば、devbox add kustomizeを追加し、bin/kustomizeをPATH上の実体へシンボリックリンクすることで、ビルドプロセスそのものを回避できます。
注意点: アプリ本体でcgoが必要な場合
アプリケーション本体でcgoが必要な場合は、そのビルド時にはCGO_ENABLED=1に戻す必要があります。
ポイントは、「ツールのgo installだけcgoを切る」という点です。これだけで、大抵の場合はすんなり通ります。
まとめ
devbox環境でGoツールのインストール時にリンクエラーが出た場合、CGO_ENABLED=0を付けるだけで解決できます。この方法は、Nix特有のSDKやclang-wrapperとの相性問題を回避する、最も手軽な対処法になります。
最後までお読みくださりありがとうございました。Twitter では、Qiita に書かない技術ネタなどもツイートしているので、よかったらフォローしてもらえると嬉しいです
→Twitter@suin