はたはたのメモ

主に勉強したことについてのメモ用ブログです。PHPerを目指しています。Pythonはまりかけ。GitHub: https://github.com/a-japonicus

cocos2d-xのantのbuild.xml設定 ①ndk-build

antの設定ファイルであるbuild.xmlを見てみると、

    <!-- version-tag: 1 -->
    <import file="${sdk.dir}/tools/ant/build.xml" />

と書かれており、antはAndroid SDKにあるbuild.xmlを使ってビルドする。

SDKbuild.xmlはそのままだとJavaしかビルドしてくれない。
そこでプロジェクトのbuild.xmlを修正し、C++コードをビルドできるようにする。

プロジェクトのbuild.xmlには

    <import file="custom_rules.xml" optional="true" />

とカスタム設定用のXMLをインポートするようになっているため、今後カスタムルールはcustom_rules.xmlに記述していく。


build-native.shを見てみると、C++をビルドするためにndk-buildを呼び出していることがわかる。
なのでcustom_rules.xmlにndk-buildでビルドするように設定を追加する。

<!-- customrules.xml -->
<?xml version="1.0" encoding="UTF-8"?>
<project name="custom_rules">
    <!-- ndk.dir -->
    <fail message="ndk.dir is missing." unless="ndk.dir" />

    <!-- ndk-build設定 -->
    <condition property="ndk-build" value="${ndk.dir}/ndk-build.cmd" else="${ndk.dir}/ndk-build">
        <os family="windows" />
    </condition>

    <!-- NDKビルド -->
    <target name="ndk-build" description="Builds the ndk.">
        <exec executable="${ndk-build}" failonerror="true">
            <arg value="-j4"/>
        </exec>
    </target>

    <!-- NDKクリーン -->
    <target name="ndk-clean" description="Removes ndk build files.">
        <exec executable="${ndk-build}" failonerror="true">
            <arg value="clean"/>
        </exec>
    </target>

    <target name="-pre-build" depends="ndk-build" />
    <target name="cleanall" depends="ndk-clean,clean" description="Removes all output files created by other targets." />
</project>

各設定の説明

ndk.dirの確認

    <!-- ndk.dir -->
    <fail message="ndk.dir is missing." unless="ndk.dir" />

NDKのディレクトリをndk.dirに書かれているかどうかを判定する。
ndk.dirが設定されていなければ失敗する。
ndk.dirは local.properties に書くか、ant実行時に引数として -Dndk.dir=NDKのパス を与える。

ndk-build

    <!-- ndk-build設定 -->
    <condition property="ndk-build" value="${ndk.dir}/ndk-build.cmd" else="${ndk.dir}/ndk-build">
        <os family="windows" />
    </condition>

ndk-buildの実行ファイル名を設定する。
windowsだとndk-build.cmd、それ以外だとndk-buildが実行ファイルになる。

ビルド

    <!-- NDKビルド -->
    <target name="ndk-build" description="Builds the ndk.">
        <exec executable="${ndk-build}" failonerror="true">
            <arg value="-j4"/>
        </exec>
    </target>

C++ビルドターゲット。
`ant ndk-build` でビルドされる
-j* オプションはビルドに使用するコア数

クリーン

    <!-- NDKクリーン -->
    <target name="ndk-clean" description="Removes ndk build files.">
        <exec executable="${ndk-build}" failonerror="true">
            <arg value="clean"/>
        </exec>
    </target>

ndk-buildでビルドされたファイルをクリーンする。
`ant ndk-clean` で実行される

実行ターゲット設定

    <target name="-pre-build" depends="ndk-build" />
    <target name="cleanall" depends="ndk-clean,clean" description="Removes all output files created by other targets." />

ビルドおよびクリーンの設定をする。
-pre-buildはビルド前に実行されるターゲットで、dependsにndk-buildを指定することでapkビルド前にndk-buildを実行する。
cleanallはndk-cleanとcleanを実行する


以上の設定を記述したcustom-rules.xmlbuild.xmlと同じディレクトリに置き、`ant debug`および`ant release`を実行するとC++のビルドも実行される。
また、`ant cleanall`でC++のオブジェクトファイルも含めた全ファイルがクリーンされる。