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を使ってビルドする。
SDKのbuild.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.xmlをbuild.xmlと同じディレクトリに置き、`ant debug`および`ant release`を実行するとC++のビルドも実行される。
また、`ant cleanall`でC++のオブジェクトファイルも含めた全ファイルがクリーンされる。