Xcode 16.4 + macOS 26.0環境のXcode Cloudでbundle installに失敗する

Xcode 16.4 + macOS 26.0環境のXcode Cloudでbundle installに失敗する

2025.09.25

現在、複数のプロジェクトでXcode 16.4を使用して開発しており、Xcode 26.0への移行準備を進めている段階だ。過去のXcodeアップデートで多数の不具合を経験したため、開発環境の更新は慎重におこなう方針を取っており、既存のバージョンで運用を続けている。

しかし、9月中旬にXcode CloudでCIを実行したところ、これまで正常に動作していたビルドが突然失敗するようになった。エラーログを確認したところ、CocoaPodsのインストール段階で失敗していることが判明した。別のプロジェクトではfastlaneのインストールが失敗していた。これらの問題を調査した結果、Xcode Cloudのデフォルト環境がmacOS 26.0に切り替わったことが原因だと分かった。

Xcode Cloud環境設定画面のスクリーンショット

本記事では、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の依存関係の深い部分で発生している。

  1. fastlane (2.228.0) - iOS/Android開発の自動化ツール
  2. simctl (1.6.10) - シミュレータ制御ライブラリ(fastlaneが依存)
  3. CFPropertyList (3.0.7) - Property List処理ライブラリ(simctlが依存)
  4. 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パスが異なるため、コンパイル時にヘッダファイルを見つけられずビルドが失敗する。

解決策

上記の検証結果から、現時点では以下のいずれかの組み合わせを使用すると良いだろう。

  1. Xcode 16.4 + macOS 15.6(既存プロジェクトの継続利用)
  2. Xcode 26.0 + macOS 26.0(最新環境への移行)

トラブルシューティング

Xcode Cloudでの設定変更手順

手順1:ワークフロー設定を開く

  1. App Store Connect にログイン
  2. 対象アプリのXcode Cloudセクションを開く
  3. 該当するワークフローの「Settings」をクリック

手順2:環境設定の変更

  1. 「Environment」セクションを展開
  2. 「macOS Version」のドロップダウンから「15.6」を選択
  3. 「Xcode Version」が「16.4」になっていることを確認

手順3:設定の保存と実行

  1. 「Save」ボタンをクリック
  2. ワークフローを再実行

長期的な解決策: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のみで完結する開発環境を構築することで、このような互換性問題を根本的に回避できるだろう。

この記事をシェアする

FacebookHatena blogX

関連記事

Xcode 16.4 + macOS 26.0環境のXcode Cloudでbundle installに失敗する | DevelopersIO