実行環境
Windows 10 Home 64bit
Android Studio 3.2.1
cocos2d-x v3.17.1
はじめに
先日、cocos2d-xのv3.17.1がリリースされました。
現在作ってるゲームのcocos2d-xのバージョンをこの3.17.1にしようと、プロジェクトを作り直しAndroid Studioでビルドしたところ、エラーが出ました。
リリースノートを見ると
Android use CMake as default PROP_BUILD_TYPE value
とのことで、Androidのビルドに使われるツールをデフォルトでCMakeに設定されるようになったようです。
公式ドキュメントに書かれていますが、プロジェクトにあるproj.android/app/gradle.propertiesというファイルを見ると以下のように書かれています。
# android native code build type
# none, native code will never be compiled.
# cmake, native code will be compiled by CMakeLists.txt
# ndk-build, native code will be compiled by Android.mk
PROP_BUILD_TYPE=cmake
ここのPROP_BUILD_TYPE
の値をndk-build
にすれば今まで通りのビルドに戻せそうです。
しかし、せっかくですのでcmakeでビルドする方法を試してみることにします。
方法
gradle.propertiesのコメントから察するに、Android.mkに書いていた内容をCMakeLists.txtに書けばよさそうです。
Android.mkではコンパイルするソースコードを列挙していましたので、CMakeLists.txtでもそのような記述ができるか探してみた結果、以下のような記述がありました。(CMakeLists.txtはプロジェクトフォルダのルートにあります)(50行付近に書かれています)
# add cross-platforms source files and header files
list(APPEND GAME_SOURCE
Classes/AppDelegate.cpp
Classes/HelloWorldScene.cpp
)
list(APPEND GAME_HEADER
Classes/AppDelegate.h
Classes/HelloWorldScene.h
)
この、GAME_SOURCEとGAME_HEADERという変数にソースファイルとヘッダーファイルを追加していけばよさそうです。
本来ならば全てのファイルを手動で追加していくのがいいのでしょうけど、それは骨が折れるのでCMakeLists.txtでワイルドカードのようなものが使えないかと調べていたら次のような書き方ができました。
# add cross-platforms source files and header files
# list(APPEND GAME_SOURCE
# Classes/AppDelegate.cpp
# Classes/HelloWorldScene.cpp
# )
file(GLOB_RECURSE GAME_SOURCE RELATIVE ${CMAKE_SOURCE_DIR} CONFIGURE_DEPENDS "Classes/*.cpp")
# list(APPEND GAME_HEADER
# Classes/AppDelegate.h
# Classes/HelloWorldScene.h
# )
file(GLOB_RECURSE GAME_HEADER RELATIVE ${CMAKE_SOURCE_DIR} CONFIGURE_DEPENDS "Classes/*.h")
GLOB
は指定されたパターンにマッチするファイルを探索する機能で、GLOB_RECURSE
でサブディレクトリも含めて探索します。
RELATIVE
で${CMAKE_SOURCE_DIR}
からの相対パスとして取得します。
CONFIGURE_DEPENDS
はファイルが変更されたかどうかを取得してビルドシステムを再生成するもののようです。(新しい機能で情報が少なくよくわかっていません…)
CMakeのドキュメントには、CONFIGURE_DEPENDS
フラグは正しく動作しない場合があると書かれていましたが、Android Studioでは確認できる限りでは有効となっているようです。
ともあれ、上記のようにCMakeLists.txtを変更したところ無事に以前と同じようにAndroid Studioでビルドができました。
おわりに
推測や、よく知らないCMakeのことでの解決でしたので、不確かな部分もあるかもしれません。
毎度のことで申し訳ありませんが、何か間違ってる・もっといい方法がある等あれば教えてください!