CyanogenModのビルド環境を整える

Cyanogenmod for P-01Dの開発協力を申し出たものの、ビルド環境がどうしてもうまく構築できず、全くお手伝いてきていませんでした。どうもビルド環境の構築って苦手なんですよね。Linuxも得意ってほどじゃないし。
それでもなんとか試行錯誤して、どうにかビルドまで出来るようになったので、覚え書きも兼ねて手順をエントリしてみようかなと。
まずはベースのLinux環境。推奨環境がUbuntuの64bit版なので、Ubuntu 12.04.1 LTSの64bit版をダウンロードしてインストールします。私はゲーム用に使っていたOpteron 246×2/2GB RAM/320GB HDD×2/RADEON 9500という構成のPCが退役したので、これにUbuntuをインストールしてビルド専用マシンにしましたが、デュアルブートにしたり、仮想PCで構築することも出来るようです。
本家Ubuntuのページから[64-bit PC (AMD64) desktop CD](ファイル名はubuntu-12.04.1-desktop-amd64.iso)をダウンロードして、CDに焼いてインストールします。それほど特殊な選択は無いと思いますが、一応、こんな感じに選択してみました。

  • 言語は日本語
  • [インストール中にアップデートをダウンロードする]と[サードパーティーのソフトウェアをインストールする]のチェックボックスは両方ON
  • [インストールの種類]では[それ以外]を選んでswapパーティションのサイズをビルド環境の推奨値である16GBに設定

他の設定は適当で。手順についてはUbuntuのTipsページを参考に。インストールが終わってデスクトップが立ち上がったら、アップデートマネージャーを起動して、ひと通りのアップデートを掛けておきます。アップデートを忘れると、これ以降の作業でエラーが出る場合がありますので、確実にやっておきましょう。
続いて、まずは必須ツール類のインストール。とはいえ、やることは決まっているので、単に端末エミュレータからコマンドをガシガシと入力していくだけです。

sudo apt-get install git-core gnupg flex bison gperf build-essential \
zip curl libc6-dev libncurses5-dev:i386 x11proto-core-dev \
libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-glx:i386 \
libgl1-mesa-dev g++-multilib mingw32 tofrodos \
python-markdown libxml2-utils xsltproc zlib1g-dev:i386 \
schedtool optipng pngcrush
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

基本的にはAOSPのページにあるInitializing a Build Environmentの通りなんですが、そのままではうまくいかないのでアレンジしてあります。具体的には、後でOracle Javaを入れるのでopenjdk-6-jdkを除外したのと、ウチの環境では何故か入っていなくてビルド時にエラーになってしまったのでschedtool/optipng/pngcrushを追加した*1のの2点。上記コマンド列を1コマンドごと端末エミュレータにコピペすればそのまま動きます。以下、コマンドについては同様。
次はrepoコマンドのインストール。インストール先はパスさえ通せばどこでも良いのですが、今回はホームディレクトリ内にDevelopmentディレクトリを作り、そこにまとめることにしました。

mkdir -p ~/Development/bin; cd ~/Development/bin
curl -O https://dl-ssl.google.com/dl/googlesource/git-repo/repo
chmod a+x repo

更にOracle Javaのインストール。何通りか方法がありますが、CyanogenMod wikiページから辿っていった先に書かれていたoab-java.shを使う方法を採用。

mkdir ~/tmp; cd ~/tmp
git clone https://github.com/flexiondotorg/oab-java6.git
sudo ./oab-java6/oab-java.sh
cd ~; rm -rf ~/tmp
sudo apt-get install sun-java6-plugin sun-java6-jre sun-java6-bin sun-java6-jdk

インストールの最後はAndroid SDK。極力コマンドラインで出来るようにcurlコマンドでダウンロードするようにしてみましたが、WEBブラウザでダウンロードしてきても構いません。他のものと違ってバージョンが変わるとURLも変わるので要注意。

cd ~/Development
curl -o sdk.tgz http://dl.google.com/android/android-sdk_r21.0.1-linux.tgz
tar -xvzof sdk.tgz
rm sdk.tgz
cd android-sdk-linux/tools
./android &

ダウンロードと展開が終わるとSDKマネージャーが起動するので、必要なSDKとツールを選択してダウンロードします。今回はCM9(Android 4.0.4)ベースなので、API15のSDKとPlatform-toolsをダウンロードしておきます。
あとは設定ファイルの作成と書き換えで終了。まず.bashrcへの実行ファイルのパスとビルドキャッシュ関係の追記。

cd ~
(cat << EOF) >> .bashrc

# for Build Android OS
export PATH=\$PATH:~/Development/bin:~/Development/android-sdk-linux/platform-tools:~/Development/android-sdk-linux/tools
export USE_CCACHE=1
export CCACHE_DIR=~/Development/CCACHE
EOF
source .bashrc

んで、最後にAndroid端末をUSB接続で認識させるための設定ファイル51-android.rulesの作成。

cd ~
(cat << EOF) > 51-android.rules
SUBSYSTEM=="usb", ATTRS{idVendor}=="04da", MODE="0666", GROUP="plugdev"
SUBSYSTEM=="usb", ATTRS{idVendor}=="05c6", MODE="0666", GROUP="plugdev"
EOF
sudo mv 51-android.rules /etc/udev/rules.d/
sudo chmod a+r /etc/udev/rules.d/51-android.rules

上記はP-01D用(SUBSYSTEMの1行目が通常起動時・2行目がCWM Recovery起動時)なので、他の機種ならidVendorの値を調べて書き換えてください。
ここまで設定すればビルド環境は完成。Cyanogenmod for P-01Dなら、README.mdに記載のコマンドを順に入力していくだけでビルドが始まります。

*1:このせいでどれだけ試行錯誤したことか……。rootスレの皆様、ありがとうございます。