Firefox OS を Raspberry Pi (Model B rev2 and Model B+) 向けにビルドしてみる  

#前置き
この記事は、Firefox OS使用歴0日の人間が、Firefox OSをRaspberry Pi向けにビルドしてみるという、なんとも無謀な企画です。
「自分でOS内部をハックし、動作検証する為の手ごろなハードウェアとして低価格PCであるRaspberry Piを利用できないか？」と思い自らビルドにチャレンジしてみました。
2014年頃に開発用端末の販売があったようですが、興味を持った時には時すでに遅し。

ネットを調べると、Raspberry Pi上で動作報告をちらほら見かけるのですが、ソースからコンパイルして動作成功している事例が日本語記事としてはあまりなさそうなので今回試してみました。

ですので多数不備などあるかもしれません。無保証です。

#試してみて、結論を先言うと
* ビルドはできたが検証用としても実用にならず
* master ブランチからのビルドはできなかった。v2.2ブランチなら、ビルドエラーを回避することは可能だった
* gccは4.8でもOK
* 画面にマウスカーソルが表示されない（[他のデバイスでは表示できたよう](http://b-soft.cocolog-nifty.com/blog/2013/05/pandaboardfiref.html)だが、同様に試してみてダメでした。）
* 一応マウス、キーボードともに認識はする（LogicoolのはOK。Microsoftの900円程度で買ったUSBマウスは認識せず）
* USB Wifiは認識する（私は、PLANEX 「GW-USEco300」で動作確認済み）
* PiTFTなどのタッチパネルは試してみたいが、安定動作は期待できなさそう

一番ハマったのは、masterブランチのソースではビルドできないということでした。
OS開発されているようなかたからすると当り前でしょうが。。
私が試した時点(2015/6/27)でのソースだと

> /${build_root}/work/B2G/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8/bin/../lib/gcc/arm-linux-androideabi/4.8/../../../../arm-linux-androideabi/bin/ld: error: hidden symbol 'sqrt' is not defined locally

というエラーがでて挫折でした。
どこかのMakeFileあたりを更新すればよいのでしょうかね？？

あと、OS動作がもっさりなのは覚悟していたのですが、マウスカーソルが出ないのは致命傷です。
どなたか表示できるようにハックできたら教えてください。

#Firefox OSとは？
Firefox OSは大きく3層に分かれています。

* カーネル部分であるGonk（ゴンク）
* Webエンジン部の Gecko（ゲッコー）
* UI層の Gaia（ガイア）

GonkはAndroidベースですが、Androidアプリ実行に必要なJava仮想マシンや、Webkitなどのライブラリを取り除いたものらしいです。
Webkitの替わりがGeckoであり、PCのFirefoxと同じエンジンを用いているようです。
WEBエンジン側がデバイスとやり取りする（直接ではなくWeb API経由）ため、当然UI層であるGaiaはHTML5やCSS、JSでコーディングされるということになります。

#準備
##1.MDNに記載されている「初回 B2G ビルドの準備」まで行う

ビルドする手順は、[MDN(Mozilla Developer Network)](https://developer.mozilla.org/ja/Firefox_OS/Building_and_installing_Firefox_OS)をご覧ください。

私が試したビルド環境は以下の通りです。

* Linux PC (Ubuntu 14.04 TLS Desctop 64bit)
* HDD 50GB ほど （私は最初は20GBしか割り当ておらず、ビルド中ディスク容量がいっぱいになってました。）

「初回 B2G ビルドの準備」をかいつまんでまとめると、

> mkdir ${build_root}　※私はホームディレクトリ以下にworkフォルダを作成し、そころbuild rootにした
> git clone git://github.com/mozilla-b2g/B2G.git
> cd B2G
> BRANCH=v2.2 ./config.sh rpi

とすれば良いみたいです。
javaや、その他ライブラリ群はMDNにある通りにapt-getでインストールをしておいてください。

あと、日本語環境を含めたビルドをしたい場合はこちらが参考になりそうです。（私は未着手）
[ZTE OPEN C FirefoxOS(B2G)をビルドしてアップデートする2](https://blog.babibubebo.org/archives/837)

##2.rpi用のパッチを当てる
mozilla wikiというところに [Hacking b2g on Raspberry Pi](https://wiki.mozilla.org/Hacking_b2g_on_Raspberry_Pi#Building_b2g_for_RPi)というページがあります。ここにrpi向けビルド方法が書いてありますのでじっくり読みます。あと、[ラズベリーパイにB2Gをハッキングの翻訳私家版](http://minashiro.net/computer/hacking-b2g-on-raspberry-pi/)に翻訳版があるので英語が読めない僕のような人はありがたく眺めます。

で、そこにはpatchを当てろとありますのでやります。

>  cd ${build_root}/B2G
> (cd gecko && git apply [the patch you downloaded])

としますが、エラーで怒られます。
サイトに書かれている通り、 patch -p1 でパッチを当てます。

> (cd gecko && patch -p1 < [the patch you downloaded])

パッチが当てられない箇所がいくつかありエラーが出ますが無視します。
（自分で勝手に手パッチしたら、逆にビルドでエラーがでて大変なことになりました）

あと、ビルド前に ${build_root}直下に.userconfのファイルを作成し、設定が必要です。
それはこちらが参考になりました。
[Firefox OS ビルド用のユーザ設定ファイル](https://gist.github.com/dynamis/7191397)

私は日本語ローカライズ関係はすべてまず設定をコメントアウト、gccのバージョンについてもコメントアウトしました。
rpi用の設定jsがあるので、それに関しては設定を読むようにしました。
> \####    Gaia Config
> \# Custom Setting File
> export GAIA_PATH= \${GAIA_PATH:-\$(cd gaia; pwd)}
> export CUSTOM_SETTINGS="${GAIA_PATH}/build/config/custom-settings.json"

※$の前のエスケープ文字は不要。qiitaだとおかしく表示されてしまう・・・

custom-settings.json は　[Hacking b2g on Raspberry Pi](https://wiki.mozilla.org/Hacking_b2g_on_Raspberry_Pi#Building_b2g_for_RPi)に記載があるとおり、CUSTOM_SETTINGSに指定したパスにjsファイルをコピーをしてください。

これでようやくビルドの準備は整いました。
MDNにある通り

> cd ${build_root}/B2G
> ./build.sh -j2

とします。
※-jの後の数字はCPU物理コア数

#ビルドエラー対処
あとはビルドエラーが出ないことを祈るのみですが、エラーは出ました。
覚悟しておいてください。

##1.frameworks/base/include/utils/KeyedVector.h でエラー
参考：http://forum.xda-developers.com/showthread.php?t=1980379
↓まずこんなエラーを吐きます。
>frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
>make: *** [out/host/linux-x86/obj/EXECUTABLES/aapt_intermediates/AaptAssets.o] Error 1

_fix1_

* vi frameworks/base/tools/aapt/Android.mk
* Add '-fpermissive' to line 31:

``` frameworks/base/tools/aapt/Android.mk
LOCAL_CFLAGS += -Wno-format-y2k -fpermissive
````

↓次はこんなエラーになりました。
>frameworks/base/include/utils/KeyedVector.h:193:31: note: use ‘this->indexOfKey’ instead
>make: *** [out/host/linux-x86/obj/STATIC_LIBRARIES/libutils_intermediates/AssetManager.o] Error 1

_fix2_

* vi frameworks/base/libs/utils/Android.mk
* Add '-fpermissive' to line 64:

```frameworks/base/libs/utils/Android.mk
LOCAL_CFLAGS += -DLIBUTILS_NATIVE=1 $(TOOL_CFLAGS) -fpermissive
```

##2.make[6]: *** [Unified_c_memory_jemalloc1.o] エラー 1
[jemalloc GitHub](https://github.com/jemalloc/jemalloc/commit/a2136025c4c4861b91f361a90c1dc94214848708)にあった修正を施したところエラーは出なくなりました。
※これが正しいのかはわかりません・・・

##3.error : 'xxx' defined but not used が多発
[Bug 1134599 - Fix Rpi build target in B2G ](https://bugzilla.mozilla.org/show_bug.cgi?id=1134599)にあるパッチを当てる。
私は手でコードをなおしました。。
上記のパッチを当ててもほかにも同様のエラーがでましたが、コメントアウトで回避したかも。

##4.Only GCC 4.6 or newer supported
ビルドマシンにはgcc4.6以降をインストールしているのに、こんなエラーが出て混乱します。
対処は、[[暫定版] FxOS v2.2 ビルド方法 (ZTE open)](http://kws-shinshu.info/?m=201501)が参考になりました。
manifestを自分のビルド対象の[v2.2ブランチで取得](https://github.com/mozilla-b2g/b2g-manifest/tree/v2.2)し、

```rpi.xml
<project name="platform_bionic" path="bionic" remote="b2g" revision="v2.2"/>
```
を masterブランチのものに書き換え、platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8についての記述も追加しました。

```rpi.xml
<project path="bionic" name="platform_bionic" remote="b2g" revision="bcm2835-4.0.1_r1.1" />
・・・
<project path="prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" name="platform/prebuilts/gcc/linux-x86/arm/arm-linux-androideabi-4.8" revision="master" />
```

で、再度

> cd B2G
> BRANCH=v2.2 ./config.sh rpi

を行います。

※manifestについて私は全く知らず、[（書籍）Firefox OS アプリ開発ガイド](http://www.ric.co.jp/book/contents/book_921.html)にある説明を読んで多少知識を付けました。

#参考文献・サイト
- [（書籍）Firefox OS アプリ開発ガイド](http://www.ric.co.jp/book/contents/book_921.html)
- [Firefox OS のコードを全文検索するための OpenGrok](http://reading.fxos.org/source/)

![IMG_1044.JPG](https://qiita-image-store.s3.amazonaws.com/0/83544/23252ec8-1d33-25f2-eebe-a6aab7f748d0.jpeg)