コマンドラインでcocos2d-xを簡単にビルドするためのMakefile

# はじめに

cocos2d-xをビルドする時、iOSならxCode、AndroidならEclipseでしょうか。
開発中ならコマンドでさくっとビルドして確認するといった方が効率がいいこともあると思います。

`cocos`コマンド(`cocos2d-console`というらしい)でビルドできたりするのですが、自分の場合オプションを覚えるのが面倒だったので`Makefile`を介してビルドとかしています。

## Makefileコード

cocos2d-xプロジェクトのルートディレクトリに以下のコードをコピーして`Makefile`として作るだけです。

```makefile
REPO_ROOT      := $(shell pwd)
USERPLATFORM    = $(shell uname)
DEPLOY_DIR      = $(REPO_ROOT)/deploy

#
# set platforms
#
PLATFORMS = android
ifeq ($(USERPLATFORM), Linux)
PLATFORMS += linux
endif
ifeq ($(USERPLATFORM), Darwin)
PLATFORMS += ios
endif

# common
REMOVE=rm -fr
JOB=-j 8
MAKE=cocos

default: all
all: $(PLATFORMS)

define PLATFORM_RULES
.PHONY: $(1)
$(1):
	@$(MAKE) run -p $(1) $(JOB)
deploy_$(1): FORCE
	@$(MAKE) deploy -p $(1) $(JOB)
build_$(1): FORCE
	@$(MAKE) compile -p $(1) $(JOB)
endef
$(foreach a,$(PLATFORMS),$(eval $(call PLATFORM_RULES,$(a))))


distclean:
	@echo "##### clean cocos ####"
	$(REMOVE) bin
	$(REMOVE) cocos2d/build/build
	$(REMOVE) cocos2d/cocos/platform/android/java/bin
	$(REMOVE) cocos2d/cocos/platform/android/java/gen
	$(REMOVE) cocos2d/cocos/platform/android/java/local.properties

clean_android:
	@echo "##### clean android ####"
	$(REMOVE) proj.android/assets
	$(REMOVE) proj.android/bin
	$(REMOVE) proj.android/gen
	$(REMOVE) proj.android/libs/armeabi
	$(REMOVE) proj.android/libs/x86
	$(REMOVE) proj.android/local.properties
	$(REMOVE) proj.android/obj

clean_ios:
	@echo "##### clean ios ####"
	$(REMOVE) proj.ios_mac/build

clean_linux:
	@echo "##### clean linux ####"
	$(REMOVE) linux-build

.PHONY: all android clean clean_android clean_ios clean_linux distclean
FORCE:
```
[by gist](https://gist.github.com/caad1229/8b501cf214b62dd415fa)

## Makeコマンド

簡単にコマンドの解説します。

### Android

- エミュレータの場合、CPU設定をADMにすること
- エミュレータの場合、Use Host GPUにチェックしておくこと
- アプリをインストールする場合、デバイスに接続しておく必要がある

```bash
$ make android          # buildして接続しているデバイスにインストールする
$ make build_android    # buildのみ
$ make clean_android    # android関連をクリーン
```

### iOS

- エミュレータの場合、自動で立ち上がる

```bash
$ make ios          # buildしてアプリケーションが実行される
$ make build_ios    # buildのみ
$ make clean_ios    # ios関連をクリーン
```

### linux

```bash
$ make linux
$ make build_linux
$ make clean_linux
```

### distclean

- cocos2d-xのライブラリを含むすべてが削除される
- 再度ビルドする場合は時間がかかる

```bash
$ make distclean
```

# おしまい

デバイス指定できないし`clean`のところなんか雑でして、そんなにフレキシブルではないですが、`make`コマンドなので補完とかしてくれるし便利だと思います。

実際、自分はiOSとAndroidのマルチプラットフォーム開発なのですが、IDEはxcode、androidはコマンドでそれぞれ開発しています。IDEを切り替える必要がないので楽です。

それにしても`cocos2d-console`、helpを見る限り色々できそうです。パッケージ管理とかもできるそうな。(http://www.slideshare.net/giginet/cocos2dconsole)

`cocos2d-console`でできることを調べてまとめたいですね^^;

# おまけ

## cocos2d-xを最初から設定してみる

初めて使う人のために一応手順を書いておきます。ほとんど公式の[README.md](https://github.com/cocos2d/cocos2d-x/blob/v3/README.md)の手順と同じです。

### 下準備

#### ant install

- Androidビルドのために`ant`をインストールしておきます。(ついでに`wget`も)

```bash
$ brew install ant wget
```

#### downloads NDK

- ndkが必要なので[ダウンロード](http://developer.android.com/intl/ja/ndk/downloads/index.html#Downloads)して展開、任意のディレクトリに置きます

```bash
# 権限変更
$ chmod 755 ./android-ndk-r10e-darwin-x86_64.bin
# 展開 (数分かかる場合あり)
$ ./android-ndk-r10e-darwin-x86_64.bin
```

※ android studioを使っている場合、`~/Library/Android/sdk/ndk-bundle`にあるはず


### cocos2d-xの設定

`git clone`してバージョンは`v3.10`(2016/01現在の最新)にします。

```bash
$ git clone https://github.com/cocos2d/cocos2d-x.git
$ cd ./cocos2d-x
$ git checkout v3.10
$ git submodule update --init
```

`download-deps.py`で依存を解決して、`setup.py`で環境変数を設定します。NDKの場所を尋ねられた場合は、前述で展開したディレクトリを入力してEnterします。

```bash
$ python download-deps.py
$ ./setup.py
```

環境設定ファイルを読み直します。(自分は`bash`なので`.bash_profile`)

```bash
$ source .bash_profile
```

環境設定ファイルを見てみると、以下のように環境変数が設定されているはずです。(ホームディレクトリは`~/`に置き換えてあります)

```bash
$ cat .bash_profile
    : # 略
# Add environment variable COCOS_CONSOLE_ROOT for cocos2d-x
export COCOS_CONSOLE_ROOT=~/cocos2d-x/tools/cocos2d-console/bin
export PATH=$COCOS_CONSOLE_ROOT:$PATH

# Add environment variable COCOS_X_ROOT for cocos2d-x
export COCOS_X_ROOT=~/
export PATH=$COCOS_X_ROOT:$PATH

# Add environment variable COCOS_TEMPLATES_ROOT for cocos2d-x
export COCOS_TEMPLATES_ROOT=~/cocos2d-x/templates
export PATH=$COCOS_TEMPLATES_ROOT:$PATH

# Add environment variable ANDROID_SDK_ROOT for cocos2d-x
export ANDROID_SDK_ROOT=~/Library/Android/sdk
export PATH=$ANDROID_SDK_ROOT:$PATH
export PATH=$ANDROID_SDK_ROOT/tools:$ANDROID_SDK_ROOT/platform-tools:$PATH

# Add environment variable NDK_ROOT for cocos2d-x
export NDK_ROOT=~/Library/Android/sdk/ndk-bundle
export PATH=$NDK_ROOT:$PATH

# Add environment variable ANT_ROOT for cocos2d-x
export ANT_ROOT=/usr/local/Cellar/ant/1.9.6/bin
export PATH=$ANT_ROOT:$PATH
```

### Project作成して実行

プロジェクト作成します

```bash
$ cocos new MyGame -p com.example.mygame -l cpp
```

上記の`Makefile`をダウンロードします。(自分でコピペしてもいいです)

```bash
$ cd ./MyGame
$ https://gist.githubusercontent.com/caad1229/8b501cf214b62dd415fa/raw/3dc5b8136fe2d8de5446dded8394142805b9e60a/Makefile
```

ビルドしてインストールしてみます。
(Androidのエミュレータか、実機を接続しておいてください)

```bash
$ make android
```

ココスくん(勝手に命名)出ましたか？

<img width="618" alt="スクリーンショット 2016-01-26 20.35.04.png" src="https://qiita-image-store.s3.amazonaws.com/0/99856/a699bd5d-850d-e320-b0f4-bbd19c98866c.png">

実際、`c++`の部分だけ確認したかったら`build_native.py`叩いてもビルドだけならできます。色々試してみてください！

```bash
$ cd ./proj.android
$ ./build_native.py
```