[Cocos2d-x][iOS] Cocos2d-x 3.0 プロジェクトに CocoaPods を導入する

2014.05.14

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Cocos2d-x 3.0

Cocos2d-x 3.0 のメジャーバージョンがリリースされ、弊社アプリでも早速使い始めようと思っています。 これまでは Cocos2d-x 2.2.3 などでゲームアプリを開発していましたが、ライブラリの管理には CocoaPods を利用していました。 3.0 でも使うためには少しプロジェクト設定の修正が必要だったので、プロジェクトの作成から CocoaPods をセットアップし、ビルドするところまでの手順をまとめておこうと思います。

なお、Cocos2d-x 3.0 の概要については荒川が記事にまとめていますので、そちらを御覧ください。

プロジェクトの作成

まずはプロジェクトの作成をざっくりと。以下のコマンドで作成できます。

# cocos2d-xの新規プロジェクトを作成する
$ cocos new SampleGame -p jp.classmethod.SampleGame -l cpp
Runing command: new
> Copy template into /Users/suwa-yuki/work/cocos2d-x-3.0/projects/SampleGame
> Copying cocos2d-x files...
> Rename project name from 'HelloCpp' to 'SampleGame'
> Replace the project name from 'HelloCpp' to 'SampleGame'
> Replace the project package name from 'org.cocos2dx.hellocpp' to 'jp.classmethod.SampleGame'

これで作成できました。

次に Git で管理するために構成を少し修正します。CocoaPods を利用するということはソースコードを Git などで管理して Jenkins さんにビルドしてもらうとか、そういう感じのことを想定しています。Cocos2d-x 3.0 からはプロジェクト作成時に Cocos2d-x のビルドに必要なソースファイルが cocos2d というフォルダにコピーされるようになりました。フォルダ階層を気にする必要がなくなる点は良いのですが、これをリポジトリにコミットするのはダサいので何とかスマートにしたいです。ということでこちらの記事を参考に、git submodule を使うようにします。

# cocos2dフォルダとさようならする
$ rm -rf cocos2d

# Gitリポジトリにする
$ git init

# submoduleを追加する
$ git submodule add http://github.com/cocos2d/cocos2d-x.git cocos2d

# cocos2d-xのビルドに必要なライブラリをダウンロードする
$ cd cocos2d
$ ./download-deps.py

これで余計なファイルがコミットされなくなりました。

CocoaPods の導入

Cocos2d-x 3.0 からは iOS & Mac のプロジェクトフォルダが proj.ios_mac になりました。今回はこのフォルダ内の Xcode プロジェクトを対象に CocoaPods を導入します。

# Podfileの生成
cd proj.ios_mac
pod init

Podfile の中を編集します。とりあえず適当なライブラリを詰め込みましょう。

Podfile

# Uncomment this line to define a global platform for your project
# platform :ios, "6.0"

target "SampleGame iOS" do

  pod "GoogleAnalytics-iOS-SDK"

end

target "SampleGame Mac" do

end

そしていつも通りインストールです。

$ pod install
Analyzing dependencies
Downloading dependencies
Installing GoogleAnalytics-iOS-SDK (3.0.7)
Generating Pods project
Integrating client project

[!] From now on use `SampleGame.xcworkspace`.

[!] The target `SampleGame iOS [Debug]` overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Pods-SampleGame iOS.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `SampleGame iOS [Debug]` overrides the `LIBRARY_SEARCH_PATHS` build setting defined in `Pods/Pods-SampleGame iOS.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `SampleGame iOS [Debug - Release]` overrides the `GCC_PREPROCESSOR_DEFINITIONS` build setting defined in `Pods/Pods-SampleGame iOS.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

[!] The target `SampleGame iOS [Debug - Release]` overrides the `LIBRARY_SEARCH_PATHS` build setting defined in `Pods/Pods-SampleGame iOS.xcconfig'.
    - Use the `$(inherited)` flag, or
    - Remove the build settings from the target.

何か言われています。これは 2.x 系でも同様の警告が出るのですが、ざっくり言うと「Target が GCC_PREPROCESSOR_DEFINITIONSLIBRARY_SEARCH_PATHS を上書きしてるから $(inherited) とか使ってね」という話です。これについては次項で修正します。

プロジェクト設定の修正

先ほど CocoaPods を使って生成した SampleGame.xcworkspace を開いてビルドしてみましょう。

cocos2dx-3-cocoapods01

エラーが発生しました。Cocos2d-x のソースフォルダが見れていません。この問題は Build Settings が継承されていない ことによるものです。「SampleGame iOS」 Target の設定を開き、「Levels」を押してみましょう。

cocos2dx-3-cocoapods02

分かりやすく言うと「SampleGame Project の設定」→「Pods の設定」→「SampleGame Target の設定」の順で読み込まれていきます(詳しくはこちらを参照してください)。つまり、SampleGame Target の設定が Pods の設定を継承していなければ Pods の設定は反映されませんし、SampleGame Project から Pods に対しても同様です。先ほど pod install したときに出た警告もこのことを指しています。そのため、SampleGame Project の設定から SampleGame Target の設定まで、きちんと継承されるように修正する必要があります。

まずは Pods の設定を変更します。Pods プロジェクトの中にある Pods-SampleGame iOS.xcconfigを開き、HEADER_SEARCH_PATHSLIBRARY_SEARCH_PATHS$(inherited) を追加してください。

GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1
HEADER_SEARCH_PATHS = $(inherited) "${PODS_ROOT}/Headers" "${PODS_ROOT}/Headers/GoogleAnalytics-iOS-SDK" $(SDKROOT)/usr/include/libz
LIBRARY_SEARCH_PATHS = $(inherited) "$(PODS_ROOT)/GoogleAnalytics-iOS-SDK"
OTHER_CFLAGS = $(inherited) -isystem "${PODS_ROOT}/Headers" -isystem "${PODS_ROOT}/Headers/GoogleAnalytics-iOS-SDK"
OTHER_LDFLAGS = -ObjC -lGoogleAnalyticsServices -lsqlite3 -lz -framework CFNetwork -framework CoreData -framework SystemConfiguration
PODS_ROOT = ${SRCROOT}/Pods

次に SampleGame の Target の SampleGame iOS の「Build Settings」を開き、GCC_PREPROCESSOR_DEFINITIONSLIBRARY_SEARCH_PATHSLIBRARY_SEARCH_PATHS をそれぞれ検索し、$(inherited) を追加してください。

cocos2dx-3-cocoapods03

最後に、「Other Linker Flags」を修正します。-ObjC フラグが付いていますが、これだと利用できないクラスまでビルドに含めてしまってエラーになるので、-force_load $(BUILT_PRODUCTS_DIR)/libPods-SampleGame\ iOS.a に修正します。

cocos2dx-3-cocoapods04

これでビルドに成功するはずです!

cocos2dx-3-cocoapods05

まとめ

これで Cocos2d-x 3.0 のプロジェクトで利用するライブラリを CocoaPods を使って管理できるようになりました。2.0 から変更された点もあり、エラーの解決方法を探るのに私は結構時間を書けてしまいました…。ですが、まぁ1度作ってしまえば使いまわせるので、良いノウハウが貯められたかなぁと思います。CocoaPods の導入を検討されているかたはぜひ参考にしていただければと思います。