cocos2d-x-3.0rc0メモ
自メモ)
久しぶりに触ったらまたごっそり構成が変わってたので
プロジェクト新規作成から。
の説明を見たら、cocosコマンドなるものを新規導入したので
プロジェクト直下のsetup.pyを実行しろと記載が。
ただcocos2d-xのpythonスクリプトで環境を壊されたことが多々あったので
setup.pyのpythonスクリプトの中身を確認。
export ANDROID_SDK_ROOT=$ANDROID_HOME export NDK_ROOT=$ANDROID_NDK_HOME export COCOS2DX_ROOT=$HOME/cocos2d/cocos2d-x-3.0rc0 export COCOS_CONSOLE_ROOT=$COCOS2DX_ROOT/tools/cocos2d-console/bin //☆ export ANT_ROOT=/usr/share/ant/bin //☆☆ export NDK_TOOLCHAIN_VERSION=4.8 export NDK_CCACHE=`which ccache` export PATH=$COCOS_CONSOLE_ROOT:$PATH //☆
備考)
☆を追加イメージ
☆☆に関しては、Marvericksとかだと一度消えてbrewとかで入れなおしてるはずなので多分パスが違うと覆う
ccacheの話は
setup.pyの中身を見るとwinの場合はregistoryに場所を記載するっぽい
記述があるがcygwin前提で使え的なreadme.mdがあってなんか中途半端感がある*1
今後は
cocos new irof -p com.irof.hogeDriven -l cpp -d projects
な形で実行する形のようだ
cocos run -p ios
Runing command: compile Building mode: debug Update xcode please
やっぱうごかなかった・・・
$HOME/cocos2d/cocos2d-x-3.0rc0/tools/cocos2d-console/plugins/project_compile
project_compile.py L163で
if version <= '5': message = "Update xcode please" raise cocos.CCPluginError(message)
と弾いてる感じ。OSアプデが必須か。。。?
試しにコメントにしてみたら XCode4.x でも
cocos compile -p ios
自体はOK。
iosのシュミレータを立ち上げる時点でエラーと。
どうもパスが違うからコケてるっぽい?*2
まあどっちにしてもmodule追加する時点で厳しいと思うので仕方ないのかも*3
cocos run -p android
pythonで ant(build.xml)叩いてるだけなので複数デバイス接続環境じゃうまく動かせないみたい。
cocos2d-console/plugins/project_run/project_run.py をみると
cocos2d-console/plugins/project_run/ios-sim を実行していて、これがXCode4のios-simuratorに対応していないみたいorz
ここらへんは複数デバイスあったら全部に転送とか書けんのかね−*4
Provisioningしていないので、Simurator一択にはなるはずですが。。
sample)
testフォルダに変更されてるっぽい。。。
それは構わないんだけど*5今回導入したコマンド?らしきもんがそのままだとファイルが足りなくて動かないのな、、。
tests/cpp-tests を例にして触ってみる
cocos new で新規作ったプロジェクトから
あたりをコピってくる
cocos run -p android
を実行すると
Android NDK: jni/Android.mk: Cannot find module with tag 'tests/cpp-tests' in import path
Android NDK: Are you sure your NDK_MODULE_PATH variable is properly defined ?
Android NDK: The following directories were searched:
cocos compile が呼んでるのは
- cocos2d-x-3.0rc0/tools/cocos2d-console/plugins/project_compile/
- build_android.py
なわけなんですが
が指してる ../cocos2dフォルダがないわけね。。。
readme.mdにはtestは動くから試して!みたいな記載なんだけど
ココらへん.gitignoreとかしてるのかしら。。*6
で
{ "ndk_module_path" :[ “../../../cocos2d", "../../../cocos2d/cocos", "../../../cocos2d/external" ], "copy_to_assets" :[ "../Resources/" ] }
と改変して再実行してみる
箇所を確認したら、proj.ios/名前.xcodeproj が無いとエラー終了する記述が。。。
cocos2d-x-3.0rc0/tools/cocos2d-console/bin/../plugins/project_compile/project_compile.py", line 636, in run
$HOME/cocos2d/cocos2d-x-3.0rc0/tools/cocos2d-console/plugins/project_compile
project_compile.py L168で
if not xcodeproj_name: message = "Can't find the \".xcodeproj\" file" raise cocos.CCPluginError(message)
とりあえず追加して続行。。。でも何故にandroid実行コマンドで
iosの設定ファイルチェックが走る。。。?
proj.win32/build-cfg.json はなくてもコマンド自体は動く気配だったから
macなら関連は一律チェック的なpythonコードになってるんだろうな。。。(汗
from build_android import AndroidBuilder
cocos2d-x-3.0rc0/tools/cocos2d-console/bin/../plugins/project_compile/project_compile.py", line 636, in run
でAndroidBuilderモジュールが読み込めないからエラー終了。
うーん。何が足りないんだろう。。。というかこれ本当にテストしてんの??サンプル実装動かせないのにコード嫁はキツイよ*7
というか
今の時点でもオレオレコマンドpython読むのキツイ。。。
諦めて従来通りのbuild_native.py等で遣るのがいいんじゃないかな、、(遠い目
このcocosコマンドは、しばらく放置していたほうが良さげな気がする
うーん、前に書いてたcocos2dx のプロジェクトをrc0に移植してる最中だけど、コンパイルが通らんわ‥‥‥Object型が見つかりません ってどういうこと?? Ref* に変更されたんか・・
cocos2d-x 3.0-rc0 普通 propertiesファイルが存在しなかったら実行すればいいだけであって、毎回buildのたびに(runでも毎回build)実行してたら世話ないよな。。。cocosコマンド自体はalphaから存在はしてたみたいだけど作り悪すぎ。。。
cocos2d-x 3.0-rc0 cocos compile --help (project_compile.py)みたら [--ap 19] 並列ndk-buildは [-j 4]とかでいけるみたいだけど毎回指定するのも微妙やね、、、(汗
cocos2d-x 3.0-rc0 この手の設定って普通毎回変更しないから build-cfg.json とかに設定書けばいいんじゃないの?普通。自分が管理してるndk-project って物によってNDKのver切り替えてるから 環境パス定義一択なのもあれなんだよな、、
NDK Debug)
3.0beta => 3.0RC0 に移行してたんですが
ADT 22.6.1から
Application.mk の指定が
#APP_ABI := all #NG #APP_ABI := armeabi armeabi-v7a x86 #OK(今回から) APP_ABI := armeabi
APP_ABIが複数し指定されてても
Debug=>NativeApplication が出来るようになってるとのことで試してたけど
allだと
たしかに駄目
[2014-03-27 13:00:14 - irof] Unknown Application ABI:
[2014-03-27 13:00:14 - irof]
[2014-03-27 13:00:14 - irof] Unable to detect application ABI's
旧環境より .cprjojectをコピーしてきただけでは
1個指定でも動かなくなってる‥‥‥
コンソールにビルドのログが全くでなくなった‥‥‥なんだこれ。。。
[2014-03-27 15:09:06 - irof] gdbserver output:
[2014-03-27 15:09:06 - irof] run-as: exec failed for lib/gdbserver Error:No such file or directory
[2014-03-27 15:09:06 - irof] Verify if the application was built with NDK_DEBUG=1
コンソールで直実行だと libs/x86/gdbserver 等は生成される
#ndk-build -B NDK_DEBUG=1 V=1 ndk-build NDK_DEBUG=1 V=1
☆)-Bつけると毎回フルビルドしてしまうので外しておく><
の話。コピペコードあんま良くない><
でも ADT22.6.1のNativeSupportで生成されるファイルもなんか変。。*8 *9
差分を比べてみると
.project
<buildSpec> <buildCommand> <name>org.eclipse.cdt.managedbuilder.core.genmakebuilder</name> <triggers>clean,full,incremental,</triggers> <arguments> </arguments> </buildCommand>
らへんが足りない。
そこ追記 + beta2で動いてた .cprojectを持ってきたら動くようになった・・。なんか怖い。。。
とりあえずメモってはおく。。
android project 変な感じ*10にメンテされてるよな‥‥‥。なんだこれ・・・
でしばらくソースいじってたらプロジェクトがいつの間にか真っ赤にして実行できず
include pathとか追加しても cocosの本体のほうで文法エラーとかでててダメな状態なので一律無視が楽。
XCodeとかでは問題になってないようなので NDK(CDT?) Pluginがダメダメさんなのか。。。?
ちなみに.cprojectのbuild設定は
ANDROID_HOME/jython.sh
#!/bin/sh $JAVA_HOME/bin/java -jar $ANDROID_HOME/tools/lib/jython-standalone-2.5.3.jar $*
な設定で
${SDK_ROOT}/jython.sh ${ProjDirPath}/build_native.py NDK_DEBUG=1
でも
ndk-build -B NDK_DEBUG=1
でも大して変わらず。
そもそもNDK_MODULE_PATHの設定って
な感じでちゃんと対比して設定していないから追加しなければいけない設定なわけだし。。。
ただ IOSプロジェクトに関しては
でsearch path等を設定しているのは凄く好感が持てた。
($SRCROOT)
仕事で参考にしながら作ってるソースが 何時もフルパス指定でemuratorすら動かせない設定なので‥‥
GUIだけでポチポチやってると自然とそうなるのかなー(汗
- build_native.py
新しくなってたのは知ってたんだけど、なんかインテンドとかずれてて
デフォルトでエラーに成ってたので動かすの苦労した、、、
うーん、cocosコマンドしかデバックしてないのか??
自分的には x-pluginのpath/prop設定読込等 を追加したかっただけなのに、、、、(汗
#!/usr/bin/python # build_native.py # Build native codes from __future__ import with_statement #append import sys import os, os.path import shutil from optparse import OptionParser # ==== append load_properties_variables start def load_properties_variables_sdk(): d = {} with open('local.properties') as f: for line in f: tokens = line.split('=') if len(tokens) <2: continue d[tokens[0]] = '='.join(tokens[1:]).rstrip('\n') print ('%s, [%s]' % (tokens[0],d[tokens[0]])) try: SDK_ROOT = d['sdk.dir'] except Exception: SDK_ROOT = None return SDK_ROOT def load_properties_variables_ndk(): d = {} with open('local.properties') as f: for line in f: tokens = line.split('=') if len(tokens) <2: continue d[tokens[0]] = '='.join(tokens[1:]).rstrip('\n') print ('%s, [%s]' % (tokens[0],d[tokens[0]])) try: NDK_ROOT = d['ndk.dir'] except Exception: NDK_ROOT = None return NDK_ROOT #==== append load_properties_variables end def get_num_of_cpu(): ''' The build process can be accelerated by running multiple concurrent job processes using the -j-option. ''' try: platform = sys.platform if platform == 'win32': if 'NUMBER_OF_PROCESSORS' in os.environ: return int(os.environ['NUMBER_OF_PROCESSORS']) else: return 1 else: from numpy.distutils import cpuinfo return cpuinfo.cpu._getNCPUs() except Exception: print ("Can't know cpuinfo, use default 1 cpu") return 1 def check_environment_variables_sdk(): ''' Checking the environment ANDROID_SDK_ROOT, which will be used for building ''' # ==== append SDK_ROOT properties load start SDK_ROOT = load_properties_variables_ndk() print ('[PROP]SDK_ROOT=[%s]' % SDK_ROOT) if SDK_ROOT != None: return SDK_ROOT # ==== append SDK_ROOT properties load end try: SDK_ROOT = os.environ['ANDROID_SDK_ROOT'] except Exception: print ("ANDROID_SDK_ROOT not defined. Please define ANDROID_SDK_ROOT in your environment") sys.exit(1) return SDK_ROOT def check_environment_variables(): ''' Checking the environment NDK_ROOT, which will be used for building ''' # ==== append NDK_ROOT properties load start NDK_ROOT = load_properties_variables_ndk() print ('[PROP]NDK_ROOT=[%s]' % NDK_ROOT) if NDK_ROOT != None: return NDK_ROOT # ==== append NDK_ROOT properties load end try: NDK_ROOT = os.environ['NDK_ROOT'] except Exception: print ("NDK_ROOT not defined. Please define NDK_ROOT in your environment") sys.exit(1) return NDK_ROOT def select_toolchain_version(): '''Because ndk-r8e uses gcc4.6 as default. gcc4.6 doesn't support c++11. So we should select gcc4.7 when using ndk-r8e. But gcc4.7 is removed in ndk-r9, so we should determine whether gcc4.7 exist. Conclution: ndk-r8e -> use gcc4.7 ndk-r9 -> use gcc4.8 ''' ndk_root = check_environment_variables() if os.path.isdir(os.path.join(ndk_root,"toolchains/arm-linux-androideabi-4.8")): os.environ['NDK_TOOLCHAIN_VERSION'] = '4.8' print ("The Selected NDK toolchain version was 4.8 !") elif os.path.isdir(os.path.join(ndk_root,"toolchains/arm-linux-androideabi-4.7")): os.environ['NDK_TOOLCHAIN_VERSION'] = '4.7' print ("The Selected NDK toolchain version was 4.7 !") else: print ("Couldn't find the gcc toolchain.") exit(1) def do_build(cocos_root, ndk_root, app_android_root,ndk_build_param,sdk_root,android_platform,build_mode): ndk_path = os.path.join(ndk_root, "ndk-build") # windows should use ";" to seperate module paths platform = sys.platform if platform == 'win32': #ndk_module_path = 'NDK_MODULE_PATH=%s;%s/external;%s/cocos' % (cocos_root, cocos_root, cocos_root) ndk_module_path = 'NDK_MODULE_PATH=%s;%s/external;%s/cocos;%s/plugin/publish' % (cocos_root, cocos_root, cocos_root, cocos_root) else: #ndk_module_path = 'NDK_MODULE_PATH=%s:%s/external:%s/cocos' % (cocos_root, cocos_root, cocos_root) ndk_module_path = 'NDK_MODULE_PATH=%s:%s/external:%s/cocos:%s/plugin/publish' % (cocos_root, cocos_root, cocos_root, cocos_root) num_of_cpu = get_num_of_cpu() print ('num_of_cpu=[%s]' % num_of_cpu) if ndk_build_param == None: command = '%s -j%d -C %s %s' % (ndk_path, num_of_cpu, app_android_root, ndk_module_path) else: #command = '%s -j%d -C %s %s %s' % (ndk_path, num_of_cpu, app_android_root, ''.join(str(e) for e in ndk_build_param), ndk_module_path) command = '%s -j%d -C %s %s %s' % (ndk_path, num_of_cpu, app_android_root, ' '.join(str(e) for e in ndk_build_param), ndk_module_path) if os.system(command) != 0: raise Exception("Build dynamic library for project [ " + app_android_root + " ] fails!") elif android_platform is not None: sdk_tool_path = os.path.join(sdk_root, "tools/android") cocoslib_path = os.path.join(cocos_root, "cocos/2d/platform/android/java") command = '%s update lib-project -t %s -p %s' % (sdk_tool_path,android_platform,cocoslib_path) print ('[do_build]command=[%s]' % command) if os.system(command) != 0: raise Exception("update cocos lib-project [ " + cocoslib_path + " ] fails!") command = '%s update project -t %s -p %s -s' % (sdk_tool_path,android_platform,app_android_root) print ('[do_build]command=[%s]' % command) if os.system(command) != 0: raise Exception("update project [ " + app_android_root + " ] fails!") buildfile_path = os.path.join(app_android_root, "build.xml") command = 'ant clean %s -f %s -Dsdk.dir=%s' % (build_mode,buildfile_path,sdk_root) print ('[do_build]command=[%s]' % command) os.system(command) def copy_files(src, dst): for item in os.listdir(src): path = os.path.join(src, item) # Android can not package the file that ends with ".gz" if not item.startswith('.') and not item.endswith('.gz') and os.path.isfile(path): shutil.copy(path, dst) if os.path.isdir(path): new_dst = os.path.join(dst, item) os.mkdir(new_dst) copy_files(path, new_dst) def copy_resources(app_android_root): # remove app_android_root/assets if it exists assets_dir = os.path.join(app_android_root, "assets") if os.path.isdir(assets_dir): shutil.rmtree(assets_dir) # copy resources os.mkdir(assets_dir) resources_dir = os.path.join(app_android_root, "../Resources") if os.path.isdir(resources_dir): copy_files(resources_dir, assets_dir) def build(ndk_build_param,android_platform,build_mode): ndk_root = check_environment_variables() #sdk_root = None sdk_root = check_environment_variables_sdk() select_toolchain_version() current_dir = os.path.dirname(os.path.realpath(__file__)) cocos_root = os.path.join(current_dir, "../cocos2d") print ('current_dir=[%s]' % current_dir) app_android_root = current_dir copy_resources(app_android_root) #print ('copy_resources=[%s]' % app_android_root) if android_platform is not None: #sdk_root = check_environment_variables_sdk() if android_platform.isdigit(): android_platform = 'android-'+android_platform else: print ('please use vaild android platform') exit(1) #print ('sdk_root=[%s]' % sdk_root) if build_mode is None: build_mode = 'debug' elif build_mode != 'release': build_mode = 'debug' print ('build_mode=[%s]' % build_mode) do_build(cocos_root, ndk_root, app_android_root,ndk_build_param,sdk_root,android_platform,build_mode) # -------------- main -------------- if __name__ == '__main__': parser = OptionParser() parser.add_option("-n", "--ndk", dest="ndk_build_param", help='parameter for ndk-build') parser.add_option("-p", "--platform", dest="android_platform", help='parameter for android-update.Without the parameter,the script just build dynamic library for project. Valid android-platform are:[10|11|12|13|14|15|16|17|18|19]') parser.add_option("-b", "--build", dest="build_mode", help='the build mode for java project,debug[default] or release.Get more information,please refer to http://developer.android.com/tools/building/building-cmdline.html') (opts, args) = parser.parse_args() build(opts.ndk_build_param,opts.android_platform,opts.build_mode)
plugin)
相変わらず未メンテ。まあJSBのみがhotだから仕方ない現状も有るのだろう。。。
一応cocos2d-x-htmlが出た段階でjsbモジュールは本体側からは除去されたみたい。
それ以外は 全く差分がないような。。。(汗 *11
./cocos2d/plugin/tools/publish.sh
を実行しようとすると相変わらずpathを聞いてくるので
以前実行した
./cocos2d/plugin/tools/toolsForPublish/environment.sh
をコピーして持ってくるほうがストレスたまらないと思う‥‥*12
で新規プロジェクトで作成された中身を確認する
変更されてない点)
- .cprojectが同梱されてない
- .projectが相対パス変更されてない
うーん。まあADTでデバックすることは無いこと前提だなこりゃ。。。*13
変更されてる点)
- build_native.py/build_native.sh がなくなった。
- 環境パスを通した $COCOS_CONSOLE_ROOT/cocos コマンドで頑張れ!
う、、ん。まあ殆どXCodeで開発してるらしいから影響度少ないんだろうけど。。。。。*14
*1:まあWinのOSS対応って基本そんなところが多いんだけど。。。
*2:家でのMarvericksなら問題なかった。。
*3:会社の自分の操作端末はOSアプデ何時されるんだろう??<苦笑
*4:groovyだと自分は書いてるので同じことはpythonでできるはず
*5:といってもsampleの記述のままのこってるreadme.mdが散逸してて混乱はするが。。。
*6:まあcocos2dフォルダだけで400MBぐらいあるから当然だろうけど。。。
*7:これはbetaあたりからずっとだけど。。。
*8:.cprojectが変なファイルが生成されている....
*9:cocosのandproject上で.projectからcdtの記述消してNativeSupport追加したからかも??
*10:ADTでは動かない方向性に
*11:まあx-plugin自体JSBしか更新されてなさ気だったし。。。。とりあえず作ったよ的な扱い?
*12:毎回聞かれるのはウンザリ気味。。。
*13:まあ当然ADT使ってる人から質問有ったらしいんだけど[どうせ普通の人はeclipseだと開発しないんから別にいいじゃん]的な回答があったらしい。海外でもIOS至上主義なのかねー<苦笑