Categories: Cocos2d-x

cocos2d-x 3.4のStatic LibraryをXcode 6.2で作成してbuildを早くする手順

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 デバイス一覧表

どっちでも使えるように今回は全部ぶっこんどきました。

Rakefileを使ってStaticLibraryを作る

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は恐ろしく時間がかかったりします。

プロジェクトに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でビルド実行してみましょう。

すると。。。

なんということでしょう~。

あんなに長かったビルド時間が速攻で終わって無事にシミュレータが起動するようになりました。

まさに爆速!!

これで長かったビルド時間との戦いとも決着をつけれます!

めでたしめでたし。

mogmet

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!

  • 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.

Share
Published by
mogmet