アプリやライブラリをリリース後、不具合修正が必要になったときに、当時のビルド環境が必要になることがあります。通常は修正時点での最新版の環境を使用すれば問題ないでしょう。しかし、例えば次のような理由で当時のビルド環境が必要なことがあります。
- 影響範囲をできるだけ狭めた上で特定の不具合だけを修正したい
- 動作環境の都合でどうしても最新版のXcodeを使用できない
- ライブラリの依存関係に問題がある
- Xcodeに組み込んだサードパーティのコンパイラが正式対応しているXcodeのバージョンが必要
私はビルド環境を書いたドキュメントをコードリポジトリに入れておいたり、リリースノートや配布資料と一緒に入れておくなどして、記録を残すようにしています。
この記事では、記録を残していなかったときに、調べる方法について解説します。
Xcodeのバージョンが異なると何が変わる
Xcodeのメジャーバージョンが異なると、Xcodeに付属しているクロスプラットフォームSDKのバージョンが異なります。クロスプラットフォームSDKはUIKitやAppKitなど、OSが提供しているフレームワークを利用するためのSDKです。
ビルド時に使用したクロスプラットフォームSDKのバージョンが異なると、同じOS上でもアプリの動作が変わることがあります。過去に筆者の経験では、NSTableView
のテーブルヘッダのデザインや余白が変わった事がありました。NSBitmapImageRep
でデコードされたときに、ビットマップの垂直方向の格納方法が上下逆になったこともありました(macOS 10.5とかのときです。特定のファイルフォーマット限定だったと思います)。macOS 11で動かしたときに、取得できるOSバージョンが古いSDKでリンクしていると、10.16
となり、新しいSDKでは11.0
となることもありました。
Xcodeのリリースノートにはこれらについて書かれていることが多いですが、書かれていない場合もあります。
Info.plistファイルについて
macOSやiOSなどのApple Platform上では、アプリは.app
という拡張子を持ったアプリケーションパッケージになっています。また、フレームワークは.framework
という拡張子を持ったバンドル形式になっています。
これらのバンドルにはInfo.plist
ファイルが入っています。Info.plist
ファイルは開発時にバージョン番号をなどを入れてビルドします。開発者が入力した情報が書かれていますが、その他に、コンパイラやリンカが追加した情報があります。自動的に追加された情報の中にビルド環境に関する情報があります。
ビルド環境に関する情報
Info.plist
ファイルに追加されるビルド環境に関する情報は以下の通りです。私の予想になっているものは「?」を付けています。
キー | 説明 |
---|---|
BuildMachineOSBuild | ビルド時のOSのビルド番号 |
DTCompiler | com.apple.compilers.llvm.clang.1_0 |
DTPlatformBuild | プラットフォームSDKのツールチェーンバージョン? |
DTPlatformName | プラットフォームSDKのプラットフォーム名 |
DTPlatformVersion | プラットフォームSDKの対象バージョン |
DTSDKBuild | プラットフォームSDKのビルド番号 |
DTSDKName | プラットフォームSDKの名前 |
DTXcode | Xcodeのバージョン |
DTXcodeBuild | Xcodeのビルド番号 |
macOSアプリの例
私がビルドしたあるmacOSアプリの例です。次のようにInfo.plist
に書き込まれていました。
キー | 説明 |
---|---|
BuildMachineOSBuild | 21G217 |
DTCompiler | com.apple.compilers.llvm.clang.1_0 |
DTPlatformBuild | 14A400 |
DTPlatformName | macosx |
DTPlatformVersion | 12.3 |
DTSDKBuild | 21E226 |
DTSDKName | macosx12.3 |
DTXcode | 1401 |
DTXcodeBuild | 14A400 |
このアプリをビルドした環境は、macOS 12.6.1 + Xcode 14.0.1 です。
WikipediaにOSのビルド番号の一覧があり、確認すると、21G217
はmacOS 12.6.1
という記載があります。また、DTXcode
は上位2桁がメジャーバージョン、3桁目がマイナーバージョン、4桁目がリビジョンなので、1401
は14.0.1
です。
iOSアプリの例
私がビルドしたiOSアプリの例です。次のようにInfo.plist
に書き込まれていました。
キー | 説明 |
---|---|
BuildMachineOSBuild | 21G217 |
DTCompiler | com.apple.compilers.llvm.clang.1_0 |
DTPlatformBuild | 20A360 |
DTPlatformName | iphonesimulator |
DTPlatformVersion | 16.0 |
DTSDKBuild | 20A360 |
DTSDKName | iphonesimulator16.0 |
DTXcode | 1401 |
DTXcodeBuild | 14A400 |
このアプリをビルドした環境は、macOS 12.6.1 + Xcode 14.0.1 です。
WikipediaにOSのビルド番号の一覧があり、確認すると、21G217
はmacOS 12.6.1
という記載があります。また、DTXcode
は上位2桁がメジャーバージョン、3桁目がマイナーバージョン、4桁目がリビジョンなので、1401
は14.0.1
です。
また、DTPlatformName
にiphonesimulator
とあるように、iOSシミュレータ用にビルドしています。また、SDKはDTPlatformVersion
が16.0
になっていので、iOS 16用のSDKが使われていることがわかります。