cocos2d-xはプロジェクトを作成すると、そのプロジェクト内にライブラリも同梱して作成される。
そのため、クリーンビルドするたびにcocos2d-xのライブラリもビルドし始めるため、非常にビルドに時間がかかってしょうがない。
それを解消すべく、あらかじめライブラリはプリビルドして作っておいて毎回ライブラリのビルドは走らせないtipsのご紹介。
分かる人は読み飛ばしてもいいけど、とりあえずプロジェクト作成するところから説明。(cocos2d-xの環境設定はしてあるものとする)
$ cocos new 'HelloWorld' -p 'com.mogmet.helloworld' -l cpp
カレントディレクトリにHelloWorldというディレクトリが作成される。
とりあえずxcodeprojを開く
$ 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 デバイス一覧表
どっちでも使えるように今回は全部ぶっこんどきました。
viなど、エディターはなんでもいいのでcocos2d-xのライブラリがあるディレクトリ以下にRakefileを作成する。
$ vi HelloWorld/cocos2d/build/Rakefile
Xcodeでcocos2dxプロジェクトのビルドを早くしたい!cocos2d-xの3系のリビルドが遅いなと思ったので、Rakefileを使ってcocos2d_libsの中身を.aファイルにプレビルドしておいて、ビルドする時... cocos2d-x-3.2のcocos2d_libs.xcodeprojのプレビルド - Qiita - Qiita |
上記サイトを参考にRakefileは以下のように作成した。
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があるディレクトリに移動してビルドを始める
$ cd HelloWorld/cocos2d/build $ rake lib $ rake lipo
rake libは恐ろしく時間がかかったりします。
早速作成できた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でビルド実行してみましょう。
すると。。。
なんということでしょう~。
あんなに長かったビルド時間が速攻で終わって無事にシミュレータが起動するようになりました。
まさに爆速!!
これで長かったビルド時間との戦いとも決着をつけれます!
めでたしめでたし。
こんにちは。virapture…
View Comments
Hi, I am an indie game developer from Taiwan. Thank you so much!!!!!!!!! You really save my life. May I translate your post to Chinese version? I think many developers like me will need this tutorial... thanks again!
Thank you for your comment. I'm glad to save you!
I'll try to translate my post to Chinese when I can find the time.
no, no need, I mean I will translate your post to Chinese. In fact, I have already done it, and post it in my blog. :D
http://fstoke.me/blog/?p=4067
Thanks! ^^
Oh, I'm sorry. I misunderstood. Thank you for translation!
Your point of view caught my eye and was very interesting. Thanks. I have a question for you.
I don't think the title of your article matches the content lol. Just kidding, mainly because I had some doubts after reading the article.