読者です 読者をやめる 読者になる 読者になる

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 で新規作ったプロジェクトから

  1. .cocos-project.json
  2. proj.android/build-cfg.json

あたりをコピってくる

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/

なわけなんですが

が指してる ../cocos2dフォルダがないわけね。。。
readme.mdにはtestは動くから試して!みたいな記載なんだけど
ココらへん.gitignoreとかしてるのかしら。。*6

{
    "ndk_module_path" :[
        “../../../cocos2d",
        "../../../cocos2d/cocos",
        "../../../cocos2d/external"
    ],
    "copy_to_assets" :[
        "../Resources/"
    ]
}

と改変して再実行してみる


cocos2d-x-3.0rc0/tools/cocos2d-console/bin/../plugins/project_compile/project_compile.py", line 636, in run
箇所を確認したら、proj.ios/名前.xcodeproj が無いとエラー終了する記述が。。。

$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コードになってるんだろうな。。。(汗


cocos2d-x-3.0rc0/tools/cocos2d-console/bin/../plugins/project_compile/project_compile.py", line 636, in run
from build_android import AndroidBuilder
でAndroidBuilderモジュールが読み込めないからエラー終了。

うーん。何が足りないんだろう。。。というかこれ本当にテストしてんの??サンプル実装動かせないのにコード嫁はキツイよ*7

というか
今の時点でもオレオレコマンドpython読むのキツイ。。。
諦めて従来通りのbuild_native.py等で遣るのがいいんじゃないかな、、(遠い目

このcocosコマンドは、しばらく放置していたほうが良さげな気がする





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プロジェクトに関しては


($SRCROOT)
でsearch path等を設定しているのは凄く好感が持てた。
仕事で参考にしながら作ってるソースが 何時もフルパス指定で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

で新規プロジェクトで作成された中身を確認する

変更されてない点)

  1. .cprojectが同梱されてない
  2. .projectが相対パス変更されてない

うーん。まあADTでデバックすることは無いこと前提だなこりゃ。。。*13

変更されてる点)

  1. build_native.py/build_native.sh がなくなった。
  2. 環境パスを通した $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至上主義なのかねー<苦笑

*14:JSB開発でもデバック以外はコマンドラインらしいし。。