
Xcode 16.4 + macOS 26.0環境のXcode Cloudでbundle installに失敗する
現在、複数のプロジェクトでXcode 16.4を使用して開発しており、Xcode 26.0への移行準備を進めている段階だ。過去のXcodeアップデートで多数の不具合を経験したため、開発環境の更新は慎重におこなう方針を取っており、既存のバージョンで運用を続けている。
しかし、9月中旬にXcode CloudでCIを実行したところ、これまで正常に動作していたビルドが突然失敗するようになった。エラーログを確認したところ、CocoaPodsのインストール段階で失敗していることが判明した。別のプロジェクトではfastlaneのインストールが失敗していた。これらの問題を調査した結果、Xcode Cloudのデフォルト環境がmacOS 26.0に切り替わったことが原因だと分かった。
本記事では、Xcode 16.4とmacOS 26.0の組み合わせで発生するRubyのネイティブ拡張のビルド問題と、その回避策について紹介する。
問題の詳細
macOS 26.0環境でXcode 16.4を使用すると、fastlaneやCocoaPodsなどのRuby gemに含まれるネイティブ拡張のビルド時にエラーが発生する。この問題は、SDKパスの不整合が原因で、システムが存在しないMacOSX15.5.sdk
を参照しようとすることで起きる。
Xcode Cloudでbundle install
を実行してfastlaneをインストールしようとしたところ、以下のエラーが発生した。このエラーによってCI環境での自動化に必要なfastlaneがインストールできず、ビルドプロセス全体が停止してしまう。
エラーログ(fastlaneインストール時)
2025-09-23T01:24:43.534255739Z 🔎 Ruby: ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin25]
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
make: *** No rule to make target
`/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin25/ruby/config.h',
needed by `nkf.o'. Stop.
make failed, exit code 2
...
An error occurred while installing nkf (0.2.0), and Bundler cannot continue.
エラーログの全文は以下の通り。
エラーログ全文
2025-09-23T01:24:43.533867052Z 🔎 Ruby executable: /usr/bin/ruby
2025-09-23T01:24:43.534255739Z 🔎 Ruby: ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin25]
2025-09-23T01:24:46.574056478Z 🔎 RubyGems: 3.0.3.1
2025-09-23T01:25:20.682852952Z Successfully installed bundler-2.4.22
2025-09-23T01:25:20.683138750Z 1 gem installed
2025-09-23T01:25:20.754261191Z ✅ Bundler 2.4.22 installed
2025-09-23T01:25:21.278291010Z Your RubyGems version (3.0.3.1) has a bug that prevents `required_ruby_version` from working for Bundler. Any scripts that use `gem install bundler` will break as soon as Bundler drops support for your Ruby version. Please upgrade RubyGems to avoid future breakage and silence this warning by running `gem update --system 3.2.3`
2025-09-23T01:25:40.972848395Z Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
2025-09-23T01:25:40.973284859Z
2025-09-23T01:25:40.973551509Z current directory: /Users/local/.gem/gems/nkf-0.2.0/ext/nkf
2025-09-23T01:25:40.973794286Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/bin/ruby -I
2025-09-23T01:25:40.973915436Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0 -r
2025-09-23T01:25:40.974156051Z ./siteconf20250922-5089-1wqzuir.rb extconf.rb
2025-09-23T01:25:40.974288284Z creating Makefile
2025-09-23T01:25:40.974592096Z
2025-09-23T01:25:40.974765996Z current directory: /Users/local/.gem/gems/nkf-0.2.0/ext/nkf
2025-09-23T01:25:40.974884226Z make "DESTDIR=" clean
2025-09-23T01:25:40.975063331Z
2025-09-23T01:25:40.975192922Z current directory: /Users/local/.gem/gems/nkf-0.2.0/ext/nkf
2025-09-23T01:25:40.975377325Z make "DESTDIR="
2025-09-23T01:25:40.975473662Z make: *** No rule to make target
2025-09-23T01:25:40.975786747Z `/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin25/ruby/config.h',
2025-09-23T01:25:40.975949060Z needed by `nkf.o'. Stop.
2025-09-23T01:25:40.976097242Z
2025-09-23T01:25:40.976209576Z make failed, exit code 2
2025-09-23T01:25:40.976454163Z
2025-09-23T01:25:40.976790146Z Gem files will remain installed in /Users/local/.gem/gems/nkf-0.2.0 for
2025-09-23T01:25:40.976940475Z inspection.
2025-09-23T01:25:40.977194202Z Results logged to
2025-09-23T01:25:40.977332234Z /Users/local/.gem/extensions/universal-darwin-25/2.6.0/nkf-0.2.0/gem_make.out
2025-09-23T01:25:40.977470696Z
2025-09-23T01:25:40.977669710Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:99:in
2025-09-23T01:25:40.977901680Z `run'
2025-09-23T01:25:40.978041601Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:51:in
2025-09-23T01:25:40.978216705Z `block in make'
2025-09-23T01:25:40.978346457Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:43:in
2025-09-23T01:25:40.978593581Z `each'
2025-09-23T01:25:40.978717292Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:43:in
2025-09-23T01:25:40.978822095Z `make'
2025-09-23T01:25:40.978918846Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/ext_conf_builder.rb:62:in
2025-09-23T01:25:40.979050915Z `block in build'
2025-09-23T01:25:40.979260343Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/tempfile.rb:295:in
2025-09-23T01:25:40.979378700Z `open'
2025-09-23T01:25:40.979493862Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/ext_conf_builder.rb:29:in
2025-09-23T01:25:40.979578455Z `build'
2025-09-23T01:25:40.979731320Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:185:in
2025-09-23T01:25:40.979870923Z `block in build_extension'
2025-09-23T01:25:40.980024786Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/monitor.rb:235:in
2025-09-23T01:25:40.980170835Z `mon_synchronize'
2025-09-23T01:25:40.980282377Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:181:in
2025-09-23T01:25:40.980384213Z `build_extension'
2025-09-23T01:25:40.980489640Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:229:in
2025-09-23T01:25:40.980595031Z `block in build_extensions'
2025-09-23T01:25:40.980805060Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:226:in
2025-09-23T01:25:40.980933319Z `each'
2025-09-23T01:25:40.981093977Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/ext/builder.rb:226:in
2025-09-23T01:25:40.981244484Z `build_extensions'
2025-09-23T01:25:40.981351038Z /System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib/ruby/2.6.0/rubygems/installer.rb:830:in
2025-09-23T01:25:40.981556311Z `build_extensions'
2025-09-23T01:25:40.981693546Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/rubygems_gem_installer.rb:76:in
2025-09-23T01:25:40.981859306Z `build_extensions'
2025-09-23T01:25:40.981992500Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/rubygems_gem_installer.rb:28:in
2025-09-23T01:25:40.984643722Z `install'
2025-09-23T01:25:40.984799247Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/source/rubygems.rb:203:in
2025-09-23T01:25:40.984995937Z `install'
2025-09-23T01:25:40.985179991Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/installer/gem_installer.rb:54:in
2025-09-23T01:25:40.985451863Z `install'
2025-09-23T01:25:40.985573734Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/installer/gem_installer.rb:16:in
2025-09-23T01:25:40.994813735Z `install_from_spec'
2025-09-23T01:25:40.995000836Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/installer/parallel_installer.rb:130:in
2025-09-23T01:25:40.995198079Z `do_install'
2025-09-23T01:25:40.995385801Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/installer/parallel_installer.rb:121:in
2025-09-23T01:25:40.995626546Z `block in worker_pool'
2025-09-23T01:25:40.995953333Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/worker.rb:62:in `apply_func'
2025-09-23T01:25:40.996199552Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/worker.rb:57:in `block in
2025-09-23T01:25:40.996353416Z process_queue'
2025-09-23T01:25:40.996467253Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/worker.rb:54:in `loop'
2025-09-23T01:25:40.996582086Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/worker.rb:54:in
2025-09-23T01:25:40.996729795Z `process_queue'
2025-09-23T01:25:40.996851138Z /Users/local/.gem/gems/bundler-2.4.22/lib/bundler/worker.rb:90:in `block (2
2025-09-23T01:25:40.996999646Z levels) in create_threads'
2025-09-23T01:25:40.997253309Z
2025-09-23T01:25:40.997409501Z An error occurred while installing nkf (0.2.0), and Bundler cannot continue.
2025-09-23T01:25:40.997643544Z
2025-09-23T01:25:40.997762545Z In Gemfile_CI:
2025-09-23T01:25:40.997870246Z fastlane was resolved to 2.228.0, which depends on
2025-09-23T01:25:40.998018495Z simctl was resolved to 1.6.10, which depends on
2025-09-23T01:25:40.998243134Z CFPropertyList was resolved to 3.0.7, which depends on
2025-09-23T01:25:40.998361597Z nkf
別パターンのエラー:Xcode 26.0 + macOS 15.6の組み合わせ
興味深いことに、Xcode 26.0とmacOS 15.6の組み合わせでも、今度は逆方向のSDK不整合エラーが発生する。注目すべきは、Darwinバージョンと期待されるSDKパスの違いだ。
🔎 Ruby: ruby 2.6.10p210 (2022-04-12 revision 67958) [universal.x86_64-darwin24]
...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
make: *** No rule to make target
`/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin24/ruby/config.h',
needed by `nkf.o'. Stop.
make failed, exit code 2
...
An error occurred while installing nkf (0.2.0), and Bundler cannot continue.
この場合、Xcode 26.0はMacOSX26.0.sdk
を期待しているが、macOS 15.6(darwin24)環境にはそのSDKが存在しない。つまり、逆方向の不整合が発生している。
根本原因の分析
エラーの詳細分析
両方のエラーメッセージを比較すると問題の原因がわかる。
Xcode 16.4 + macOS 26.0の場合:
make: *** No rule to make target
`/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX15.5.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin25/ruby/config.h',
needed by `nkf.o'. Stop.
Xcode 26.0 + macOS 15.6の場合:
make: *** No rule to make target
`/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX26.0.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/include/ruby-2.6.0/universal-darwin24/ruby/config.h',
needed by `nkf.o'. Stop.
fastlaneの依存関係チェーン
今回のエラーはfastlaneの依存関係の深い部分で発生している。
- fastlane (2.228.0) - iOS/Android開発の自動化ツール
- simctl (1.6.10) - シミュレータ制御ライブラリ(fastlaneが依存)
- CFPropertyList (3.0.7) - Property List処理ライブラリ(simctlが依存)
- nkf (0.2.0) - 文字エンコーディング変換ライブラリ(CFPropertyListが依存)
この依存関係チェーンの最後にあるnkfがネイティブ拡張をビルドする際に失敗している。
SDK不整合の問題
エラーの根本原因は、XcodeバージョンとmacOSバージョンの不整合によるSDKパスの不一致にあることがわかった。検証の結果、以下の組み合わせパターンが判明した。
組み合わせ | 期待されるSDK | Darwin バージョン | ビルド結果 |
---|---|---|---|
Xcode 16.4 + macOS 26.0 | MacOSX15.5.sdk | darwin25 | ❌ 失敗 |
Xcode 26.0 + macOS 15.6 | MacOSX26.0.sdk | darwin24 | ❌ 失敗 |
Xcode 16.4 + macOS 15.6 | MacOSX15.5.sdk | darwin24 | ✅ 成功 |
Xcode 26.0 + macOS 26.0 | MacOSX26.0.sdk | darwin25 | ✅ 成功 |
つまり、XcodeとmacOSのメジャーバージョンが一致していない場合、SDKパスの不整合によりネイティブ拡張のコンパイルが失敗する。この問題はfastlaneに限らず、CocoaPodsなどネイティブ拡張を含むすべてのRuby gemで発生する。
Ruby gemのネイティブ拡張のビルドには、以下の要素が関係している。
- Xcodeに含まれるSDK: MacOSX[バージョン].sdk
- macOSのDarwinバージョン: システムのカーネルバージョン
- Rubyのヘッダファイルパス: SDKパスとDarwinバージョンの組み合わせで決定
XcodeとmacOSのバージョンが不一致の場合、期待されるSDKパスと実際のSDKパスが異なるため、コンパイル時にヘッダファイルを見つけられずビルドが失敗する。
解決策
上記の検証結果から、現時点では以下のいずれかの組み合わせを使用すると良いだろう。
- Xcode 16.4 + macOS 15.6(既存プロジェクトの継続利用)
- Xcode 26.0 + macOS 26.0(最新環境への移行)
トラブルシューティング
Xcode Cloudでの設定変更手順
手順1:ワークフロー設定を開く
- App Store Connect にログイン
- 対象アプリのXcode Cloudセクションを開く
- 該当するワークフローの「Settings」をクリック
手順2:環境設定の変更
- 「Environment」セクションを展開
- 「macOS Version」のドロップダウンから「15.6」を選択
- 「Xcode Version」が「16.4」になっていることを確認
手順3:設定の保存と実行
- 「Save」ボタンをクリック
- ワークフローを再実行
長期的な解決策:SPMへの移行
今回のような環境不整合の問題を根本的に解決するには、CocoaPodsからSwift Package Manager(SPM)への移行が最も確実な方法となる。
CocoaPods公式ブログによると、2026年12月2日からtrunkが読み取り専用化され、新規Podや新バージョンの追加ができなくなる予定だ。既存の依存関係は引き続き利用可能だが、今回のmacOS 26.0との互換性問題が発生している現状で、CocoaPodsの修正版がリリースされる可能性は極めて低い。
SPMへの移行には以下のメリットがある。
- Xcodeネイティブ統合: 追加ツールのインストールが不要
- 環境依存性の排除: Ruby環境やネイティブ拡張に依存しない
- 将来性: Appleが公式にサポートし、継続的な改善が期待できる
- CI/CD環境での安定性: Xcode Cloudとの相性が良く、環境不整合が起きにくい
特定のPodに依存している場合のSPMへの移行手順については、過去に書いたCocoaPodsの終了に備えて、cocoapods‑keysからArkana + SPMへ移行するの記事が参考になれば幸いだ。
fastlaneについても同様に、CI環境での利用を避け、ローカル環境のみでの利用に限定するか、代替ツールへの移行を検討する必要があるだろう。
まとめ
Xcode CloudがmacOS 26.0をデフォルト環境に切り替えたことで、レガシーツールとの互換性問題が表面化した。調査の結果、この問題はRuby 2.6とネイティブ拡張の組み合わせに起因し、SDKパスの不整合により発生していることが判明した。
試行錯誤の末、当面の回避策としてXcode CloudでmacOS 15.6を明示的に指定することで問題を解決できた。しかし、これはあくまで一時的な対処法だ。長期的には、CocoaPodsからSPMへ移行し、Ruby依存のツールチェーンから脱却することが望ましい。Xcodeのみで完結する開発環境を構築することで、このような互換性問題を根本的に回避できるだろう。