contenttaichino.com永遠のネバーランドCMakeでiOS用のframeworkを作ってみる先日カッコいいと書いたBlitzを、頑張ってiOS用にビルドしたという話です。Blitzに限らずC/C++で書かれたライブラリがiOSに対応している事はまれで、あーiOSに対応してたら使いたいのになーというシーンはちょくちょくあります。.frameworkを作ろうとすると.xcodeprojを作ってどうのこうのという話になりがちで、普段Autotoolsでビルドしているソースツリーに特定のしかもプロプリエタリなIDEのプロジェクトファイルを追加するとか、醜すぎて誰もやりたくないわけです。ところが最近OpenCVがiOS用の.frameworkのアーカイブを別途配布しているのを知りまして、どうやってビルドしてんのかなと見てみると、CMakeで一旦xcodeprojを吐いてから、xcodebuildという流れになっていて、それをPythonスクリプトで纏めて、ワンコマンドで.frameworkが構築出来るようになっていました。iOS用のCMakeLists.txtは必要だし、結局xcodebuild叩いてるやんとかはあるんですけど、プロジェクトファイルを管理せずに済んでいるので、ソースの構成が変わるたびにプロジェクトファイルを編集するという残念な作業からは解放されているので、なるほどなと思いました。いうわけで、真似してBlitzのソースツリーから.frameworkを作ってみようという話ですね。書いてみたシンプルなCMakeLists.txtが以下です。ビルドしてみて気づいたんですけど、Blitzのソースコードはglobals.cpp以外は全部ヘッダとして扱われていて、array.ccとかを単体でビルドしようとするとエラーになります。ビルドも超速いし、ビルドファイルも極端にシンプルで済みます。Blitzマジで凄いですね。この先C++書くときは真っ先に参考にしたいなと思います。src/globals.cpp)このCMakeLists.txtを書いていて気づいたのですけど、Xcode.app内のコンパイラ指定するんやったら別に.xcodeproj吐かなくても良くね?と思いMakefileで試してみたら普通にビルド出来ました。以下のような感じです。armv7さて、.framworkを作るのにはシミュレータ用にi386、実機用にarmv7でそれぞれビルドしたライブラリをlipoで連結する必要があります。その辺りの処理と.frameworkのファイル構成を作るのをPythonスクリプトで纏めてみたのが以下です。OpenCVで使われてるスクリプトをパクってます。os.path.abspath(sys.argv[1]))このスクリプトを以下のようにして叩くと、output_dir内に.frameworkができます。buildPythonスクリプトもCMakeLists.txtも、一般化はしてないですが、プロジェクト毎にそう大きく変化するわけではないので、何かC/C++なライブラリをiOSで使いたくなった場合は、この方法で上手くいきそうな気がします。CMakeなかなか良いです。