iOS用にユニバーサルライブラリを作る

BlocksKitをフレームワーク化した

iOS8対応のためBlocksKitをフレームワーク化したログ。
ソースコードのまま組み込むとかイヤなのでよく外部のライブラリはフレームワークにしているのでメモ。

手順

ダウンロードからビルドまで

  • github から最新ソースコードをダウンロード
  • ターゲットをBlocksKitにしてiOS Device用Releaseビルド
  • ターゲットをBlocksKitのままiPhone Simulator用Releaseビルド
  • OrganizerでBlocksKitのDerived Dataディレクトリ右の->をクリックしてFinderに表示

以下コマンドライン

ターミナルのログからひっぱり出したコマンドなので間違ってる可能性は否定できない。

$ cd <Derived Data Dir> // FinderからD&Dでpathが貼り付けできるのでそれがらく)
$ xcrun lipo -info ./Release-iphoneos/libBlocksKit.a
Architectures in the fat file: ./Release-iphoneos/libBlocksKit.a are: armv7 arm64
$ xcrun lipo -info ./Release-iphonesimulator/libBlocksKit.a
Architectures in the fat file: ./Release-iphonesimulator/libBlocksKit.a are: i386 x86_64
$ mkdir -p BlocksKit.framework/Versions/A // まとめて必要なディレクトリを作っておく
$ lipo -create ./Release-iphonesimulator/libBlocksKit.a ./Release-iphoneos/libBlocksKit.a -output ./BlocksKit.framework/Versions/A/libBlocksKit.a
$ xcrun lipo -info ./BlocksKit.framework/Versions/A/libBlocksKit.a
Architectures in the fat file: ./BlocksKit are: i386 x86_64 armv7 arm64
$ cp -r ./Release-iphoneos/include ./BlocksKit.framework/Versions/A/Headers
$ cd BlocksKit.framework
$ ln -sfh ./Versions/Current ./Versions/A
$ ln -sfh ./Versions/Current/Headers ./Headers
$ ln -sfh ./Versions/Current/BlocksKit ./BlocksKit

こんな感じで問題ないはず。

その他

ユニバーサルライブラリ

lipoコマンドでユニバーサルライブラリを作るときに-archオプションを付けてアーキテクチャの指定をすることも可能だけど、今回はiOSデバイスとiOSシミュレータでそれぞれのバイナリが既にユニバーサルになっているので、-archオプションは不要。

もしコマンドラインとかで各アーキテクチャ用にビルドして結合させる場合は-archをつけて

$ lipo -create -arch i386 ./[input binary name]> -arch armv7 ./[input binary name] -output ./[output binary name]

みたいにすればよかった気がする。

バイナリの対応アーキテクチャの確認方法について

lipo -info <binary path>で確認するとarm64が表示できず(cputype (16777228) cpusubtype (0))とかなるみたいなので、xcrun lipo -infoがいいと思う。
ただのlipoがダメというわけではない。

あとこの手の作業をする人はotoolコマンドも使った方がいろいろと捗るはず。
詳しくはman otool