cocos2d-x 3.4のStatic LibraryをXcode 6.2で作成してbuildを早くする手順
cocos2d-xはプロジェクトを作成すると、そのプロジェクト内にライブラリも同梱して作成される。
そのため、クリーンビルドするたびにcocos2d-xのライブラリもビルドし始めるため、非常にビルドに時間がかかってしょうがない。
それを解消すべく、あらかじめライブラリはプリビルドして作っておいて毎回ライブラリのビルドは走らせないtipsのご紹介。
分かる人は読み飛ばしてもいいけど、とりあえずプロジェクト作成するところから説明。(cocos2d-xの環境設定はしてあるものとする)
1 |
$ cocos new 'HelloWorld' -p 'com.mogmet.helloworld' -l cpp |
カレントディレクトリにHelloWorldというディレクトリが作成される。
とりあえずxcodeprojを開く
1 |
$ open HelloWorld/proj.ios_mac/HelloWorld.xcodeproj |
ビルド設定の変更
cocos2d_libs.xcodeprojのプロジェクトのBuild Settingsで以下のように設定する。
Architectures : Standard Architectures (デフォルトでこれになってると思いますが)
Build Active Architecture Only : NO
また、libcocos2d iOSターゲットのBuildSettingsのValid Architecturesにてarmv7s、i386、x86_64を追記する。
Valid Architectures : arm64 armv7 armv7s i386 x86_64
ちなみにValid Architecturesを設定しないとrake libコマンド実行時に以下のようなエラーで怒られたりした。
[BEROR]No architectures to compile for (ARCHS=i386 x86_64, VALID_ARCHS=arm64 armv7).
また、StaticLibraryを使ったビルドをした時に対応したCPUのアーキテクチャのものが含まれてなくてビルド出来ねーよと怒られる。
arm64 armv7 armv7sは実機でのCPUで、i386 x86_64はシミュレータでのCPUになる。
cf : iOS デバイス一覧表
どっちでも使えるように今回は全部ぶっこんどきました。
Rakefileを使ってStaticLibraryを作る
viなど、エディターはなんでもいいのでcocos2d-xのライブラリがあるディレクトリ以下にRakefileを作成する。
1 |
$ vi HelloWorld/cocos2d/build/Rakefile |
上記サイトを参考にRakefileは以下のように作成した。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
PROJECT_PATH = "./cocos2d_libs.xcodeproj" TARGET_NAME="'libcocos2d iOS'" OUTPUT_DEBUG="tmp/iphonesimulator" OUTPUT_RELEASE="tmp/iphoneos" OUTPUT_LIB="./lib" directory OUTPUT_LIB desc "静的ライブラリをビルドします" task "lib" do sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphonesimulator8.2 -target #{TARGET_NAME} -arch i386 -arch x86_64 TARGET_BUILD_DIR=#{OUTPUT_DEBUG} BUILT_PRODUCTS_DIR=#{OUTPUT_DEBUG} clean build" sh "xcodebuild -project #{PROJECT_PATH} -configuration Release -sdk iphoneos8.2 -target #{TARGET_NAME} -arch armv7 -arch armv7s -arch arm64 TARGET_BUILD_DIR=#{OUTPUT_RELEASE} BUILT_PRODUCTS_DIR=#{OUTPUT_RELEASE} clean build" end desc "lipoコマンドで各デバイス向けの静的ライブラリをひとつのバイナリにします" task "lipo" => OUTPUT_LIB do Dir.glob("#{OUTPUT_RELEASE}/*"){|path| p path file = File.basename(path) sh "lipo '#{OUTPUT_DEBUG}/#{file}' '#{OUTPUT_RELEASE}/#{file}' -create -output '#{OUTPUT_LIB}/#{file}'" } end |
参考サイトとの違いとしては、 cocos2d-x 3.4ではターゲット名が「build all libs iOS」から「libcocos2d iOS」になった。
3.4からターゲットがひとつに纏められたのでこのようなターゲット名になっている模様。らくちん。
また、xcode6.2の場合はシミュレータが8.2になっているのでそこも変えてあげている。
さらに、armv7sが指定しないとなぜかはいってくれなかったので、-archオプションで意図的に各CPUアーキテクチャの指定を入れている。
Rakefileがあるディレクトリに移動してビルドを始める
1 2 3 |
$ cd HelloWorld/cocos2d/build $ rake lib $ rake lipo |
rake libは恐ろしく時間がかかったりします。
プロジェクトにStaticLibraryを追加する
早速作成できたlibcocos2d iOS.aをプロジェクトに追加します。今回はFrameworksに適当に突っ込んどきました。
cocos2d-xのライブラリのターゲットはビルドするときにもう用済みなのでlibcocos2d Macとlibcocos2d iOSのターゲットは削除してしまいます。
プロジェクトファイルごと消せばいいじゃんというお話もあるかと思いますが、ソースを追うこともあるかもしれないので、このままプロジェクトファイル自体は残しておきます。
次に。プロジェクトに「libcocos2d iOS.a」を追加した時に自動的にBuild Phasesのライブラリに追加してくれるのですが、
前のゴミが残っていて、ちょっと気持ち悪いのでこちらも削除しておきます。
メインのプロジェクト設定 -> 対象Tragets -> Build Phases -> Link Binary With Librariesの中に、真っ赤になった「libcocos2d iOS.a」があるので選択して下の「-」ボタンから削除します。
爆速ビルドの体感
これでビルドの準備ができました。さっそく。Cmd+Rでビルド実行してみましょう。
すると。。。
なんということでしょう~。
あんなに長かったビルド時間が速攻で終わって無事にシミュレータが起動するようになりました。
まさに爆速!!
これで長かったビルド時間との戦いとも決着をつけれます!
めでたしめでたし。