Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

B2G OSのビルド

一度 ビルド環境のセットアップ が完了して、コードの 最初の pull と configure を実行すれば、Boot to Gecko をビルドすることができます。このガイドで方法を説明します。

コードを更新する

B2G をビルドするのが初めてでない方は、ビルドを始める前に最新のコードを pull したいかもしれません。これを行うには、B2G ツール群と、それに依存関係があるものを両方とも更新する必要があります。次のコマンドを実行してください:

git pull
./repo sync -d

"-d" オプションは、様々なプロジェクトの HEAD を Android マニフェストのリビジョン (つまり、デフォルトのメインストリームリポジトリのバージョン) に切り替えます。これは、リポジトリ (および関連ソース) に変更を加えているが、master バージョンに一時的に戻す必要のある時に有用です。途中段階や作業中のディレクトリの変更はそのまま残ります (すべての説明は SO の質問 を参照してください)。ソースコードに触れていない場合は、次の通常のコマンドを実行してください:

git pull
./repo sync

ターゲット名を指定すると、指定したターゲットのリポジトリを更新できます:

./repo sync gaia

repo コマンドには、興味深い、その他のオプションも利用可能です。repo help で多くの情報を得られます。

Boot to Gecko のビルド

注記: ビルドする前に、.userconfig ファイルをセットアップしてビルドをカスタマイズしたいでしょう。詳細は、.userconfig ファイルでカスタマイズ を参照してください。

Boot to Gecko のビルドは、build.sh ツールを使用するだけです:

cd B2G
./build.sh

コーヒーブレークの時間がやってきました。昼寝もできるかもしれません (特にこれが初回のビルドなら、Core i7 と 8GB RAM を搭載した PC なら 30 分くらいかかります)。前回のページの設定手順で、事前に展開された Android システムファイルのディレクトリを使っている場合、build.sh を実行する前に ANDROIDFS_DIR を設定すべきです。

補足: 新しいビルドを端末にフラッシュするための詳しい説明は、B2G OS をモバイル端末にインストールする をお読みください。

特定モジュールのビルド

Gecko など、特定のモジュールだけをビルドしたいときは、その名前を指定してください:

./build.sh gecko

一個のアプリケーションだけを更新するには、BUILD_APP_NAME 環境変数を使用すると、gaia モジュールのみをビルドできます :

BUILD_APP_NAME=calendar ./build.sh gaia

ビルド可能なモジュールのリストを取得するには、継ぎのコマンドを実行してください:

./build.sh modules

使用するプロセッサコアの数の設定

デフォルトで、B2G ビルドスクリプトがビルドに使用するコア数は、搭載されたシステムのコア数に、実行する並列タスク数の 2 倍を足した数になります。これは、build.sh 実行時に -j パラメータを指定すると変更できます。この変更は、バックグラウンドでのビルド中に、他のことでシステムを使うため CPU 負荷を少し減らす必要のあるときに有効です。また、ビルドに問題がある場合も、実行しているのが一度に 1 つのタスクだけなら、ビルドプロセスからのエラー出力を読むのが楽ですよね!

例えば、2 つの並行処理でビルドするには:

./build.sh -j2

しかし、この設定の最も一般的な使い方は、ビルドが並列で実行されないようにすることです。処理の出力が大変読みやすくなり、ビルドの問題が整理しやすくなります。これを実行するには:

./build.sh -j1

複数ロケールのビルド

複数ロケールのビルドを作成するには、以下の手順に従ってください:

  1. どの Gaia 言語ファイルを使うかを決定します。現在、locales/languages_dev.jsonlocales/languages_all.json が Gaia 言語ファイルとして使用しています。
  2. http://hg.mozilla.org/gaia-l10n から適切なロケールを gaia-l10n/ ディレクトリへ clone してください。locales/ ディレクトリを使うこともできます。言語ファイルに記載されたロケールごとのリポジトリを clone する必要があります。
  3. あなたの環境で、ステップ 2 のディレクトリの絶対パスを LOCALE_BASEDIR 環境変数に設定し、ステップ 1 の .json ファイルの絶対パスを LOCALES_FILE 環境変数に設定してください。
  4. その他、デフォルトロケールを設定したい場合は、GAIA_DEFAULT_LOCALE にロケールコードを設定します。
cd gaia/locales/
hg clone https://hg.mozilla.org/releases/gaia-l10n/v2_5/ja

環境変数を設定します:

export LOCALE_BASEDIR=$PWD/locales
export LOCALES_FILE=$PWD/locales/languages_dev.json
export GAIA_DEFAULT_LOCALE=ja

languages-dev.json を独自の languages-own.json のパスに置き換えられます。それは次のようなものになります。locales ディレクトリに clone されたリポジトリ毎にエントリを追加する必要があるでしょう:

{
  "en-US"     : "English (US)",
  "ja"        : "日本語"
}

バグ 884752 が修正 (2013年11月) されたため、(Gaia 内で入手可能なら) キーボードレイアウトを追加するのに、GAIA_KEYBOARD_LAYOUTS 環境変数が使用できます。

バグ: https://bugzilla.mozilla.org/show_bug.cgi?id=884752

レイアウト: https://github.com/mozilla-b2g/gaia/tree/v2.5/apps/keyboard/js/layouts

例えば、スペイン語と日本語のキーボードレイアウトを追加するには、次のキーボードレイアウト名を追加します。

GAIA_KEYBOARD_LAYOUTS=en,es,jp-kanji

この時点で、初めて Gaia を端末にフラッシュする準備ができました。端末を接続し、リモートデバッグが有効かどうか、[Settings] > [Device Information] > [More Information] > [Developer] の設定で確認してください。これは、一度だけする必要があります、REMOTE_DEBUGGER=1 のおかげで、Gaia の独自ビルドでこの設定をオンにできます:

 make clean && make production LOCALES_FILE=locales/languages-own.json

または

 rm -rf out objdir-gecko && LOCALES_FILE=locales/languages-dev.json ./build.sh

特定のブランチ向けのサポートされたすべてのロケールを clone または update したい場合は、このスクリプト が使えます。

公式スタイルのエンジニアリングビルドをビルドする

このセクションが古い場合は、Be job in Treeherder のログを参照して最新の変数セットを得てください。

Mozilla により配布 されているような "公式" スタイルのエンジニアリングビルドをビルドするには、コマンドラインで次のオプションを使用する必要があります:

VARIANT=eng MOZILLA_OFFICIAL=1 B2G_SYSTEM_APPS=1 GAIA_OPTIMIZE=1 B2G_UPDATER=1 B2G_UPDATE_CHANNEL=default MOZ_TELEMETRY_REPORTING=1 MOZ_CRASHREPORTER_NO_REPORT=1 LOCALES_FILE=locales/languages_all.json GAIA_KEYBOARD_LAYOUTS=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak,jp-kanji ./build.sh

以下は、引数の説明です:

変数 説明
VARIANT=eng That's how you usually define an engineering build. This is also the default value.
MOZILLA_OFFICIAL=1 Published build are Mozilla officials. This shows the B2G OS logo and the branding. Do not use it to publish your own.
B2G_SYSTEM_APPS=1 Sets the apps in the /system/b2g/webapps folder (instead of /data/local/webapps).
GAIA_OPTIMIZE=1 concatenate the Gaia sources.
B2G_UPDATER=1 Enables the nightly updates.
B2G_UPDATE_CHANNEL=default The B2G OS update channel. "Default" points to mozilla-central.
MOZ_TELEMETRY_REPORTING=1 Enables Telemetry for submitting usage data.
MOZ_CRASHREPORTER_NO_REPORT=1 Disables the B2G Desktop UI when a crash occurs, so the Gaia reporter only is used.
LOCALES_FILE=locales/languages_all.json Sets the languages available in Gaia (the relative path starts from the gaia folder).
GAIA_KEYBOARD_LAYOUTS=en,pt-BR,es,de,fr,pl,zh-Hans-Pinyin,zh-Hant-Zhuyin,en-Dvorak,jp-kanji Keyboards included in Gaia.

Blob フリーの完全システム zip をビルドする

B2G OS Master Branch Only

すでに Android が動作しているサポートされた端末を B2G 端末へ変換するために使用できる Blob-free のシステム zip をビルドできます。これは、著作権保護された blob が原因でビルドを配布できないという、長く続いた問題を解決します。私たちは、"端末から端末" を根拠としてこれを可能にしており、まずは Flame と Z3/Z3 Compact 端末のみがサポートされます。

注記: すでにビルドできているあらゆる端末に展開すべきですが、それぞれの端末でリリース前に確認が必要です。

このような zip は、次のオプションでビルドできます:

./build.sh blobfree

これで、次のもので構成される zip ファイルが生成されます:

  • 配布する zip で、パーティションの準備はできているが、イメージファイルではないもの (BOOTRECOVERYSYSTEM ディレクトリ)
  • サポート端末が adb プロパティと fastboot 変数で記述された devices.json ファイル。サポートが自明な実端末から読まれます。
  • リカバリ fstab。パーティションとイメージ間のファイル配置を対応付けます
  • dt.img。必要に応じて。
  • extract-files.sh からの生成物をベースとした、Blob からシステムへの対応付け。

作成された zip は、B2G インストーラアドオンで使用される予定です (バグ 1166276 参照)。

既知のエラー

"Build failed!"

全般的な "Build failed" というメッセージが表示された時は、いつも端末をコンピュータに接続し直すべきです。様々な理由で端末がアンマウントされていることがあります。

Keon 用の B2G の configure やビルドは Mac で "実行できない" ので注意してください。この端末用には Linux を使用する必要があります。

Mountain Lion 固有のビルドエラー

1. OS X 10.8 "Mountain Lion" (Xcode 4.4.1 以降) をビルドに使用して、下記のエラーが起こった場合:

external/qemu/android/skin/trackball.c:130:25: error: 'M_PI' undeclared (first use in this function)

B2G/external/qemu/Makefile.android ファイルを編集し、78 行目に次を追加してください:

MY_CFLAGS += -DM_PI=3.14159265358979323846264338327950288   #/* B2G_fix: not finding M_PI constant */

2. "Mountain Lion" 上で ./build.sh の実行中に、下記のエラーが起こった場合:

/System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h:797:9: error: too many #pragma options align=reset

/System/Library/Frameworks/IOKit.framework/Headers/usb/USB.h ファイル内の全ての '#pragma options align=reset' を '#pragma pack()' に置き換えてください。

Undefined symbols "_sqlite3_androidopt_handle_pragma" and "_sqlite3_androidopt_open"

このエラーは、OS X 10.7 以降で Xcode 4.5 以降を使用してビルドしている時に発生します。これを直すには、external/sqlite/dist/Android.mk ファイルに https://groups.google.com/forum/#!msg/android-building/yAfPyUqCsiQ/7zvICk4GWjYJ のパッチを適用してください。

KeyedVector.h:193:31: error: indexOfKey was not declared in this scope

このエラーは、gcc のバージョンが新しすぎる場合に発生します。ただし、私たちがシステムをビルドするのに新しいバージョンの GCC を使うようアップグレードすれば、問題ではなくなります。詳しい情報は、.userconfig ファイルでカスタマイズ を参照してください。

arm-linux-androideabi-g++: Internal error: Killed (program cc1plus)

このエラーが表示されたら、おそらく空きメモリが不足しています。./build.sh を実行する前に十分な空きメモリを確保してください。4GB の RAM があればうまく実行できるでしょう。

"...is referenced by DSO" error

エミュレータのビルド時に、このようなエラーが発生した場合:
/usr/bin/ld: out/host/linux-x86/obj/EXECUTABLES/triangleCM_intermediates/triangleCM: hidden symbol `_XGetRequest' in out/host/linux-x86/obj/STATIC_LIBRARIES/libSDL_intermediates/libSDL.a(SDL_x11dyn.o) is referenced by DSO.

binutils のいくつかのバージョンでこのエラーが発生します。Debian 安定版では、binutils-gold パッケージをインストールして gold リンカを使用してください。注意点として、gold リンカは binutils によりインストールされますが、デフォルトでは使用されません。ただ binutils-gold が実行します。

error: device not found

./build.sh の開始時に、例えば次のように "error: device not found" エラーのメッセージが表示された場合:

Blob setup script has changed, re-running
Backing up system partition to backup-flame
error: device not found
Pulling files from ../../../backup-flame
cat: ../../../backup-flame/system/build.prop: No such file or directory
cat: ../../../backup-flame/system/build.prop: No such file or directory
Invalid system backup - Wrong base version found.

Do this:
1. Delete backup-flame
2. Flash your device with KK based images from the vendor
3. Try building again

> Build failed! <

この場合、adb devices コマンドを実行して、端末が adb でアクセス可能か確かめてください。端末が接続されていれば、adb デバッグが端末の開発者メニューで有効になっているか確認し、端末がロックされていてもアクセスできるようするため、画面ロックをオフにしてください。環境設定アプリで "Screen Lock" セクションの "Lock Screen" のチェックを外してください。

ビルドシステムのテスト中にビルドエラーが発生した場合

ビルドシステムのビルド後のテスト中に、時々 (特にビルドツールやオペレーティングシステムの更新後に) このような奇妙なエラーが発生することがあります:

Generating permissions.sqlite...
test -d profile || mkdir -p profile
run-js-command  permissions
WARNING: permission unknown:offline-app
WARNING: permission unknown:indexedDB-unlimited
build/permissions.js:122: NS_ERROR_UNEXPECTED: Component returned failure code: 0x8000ffff (NS_ERROR_UNEXPECTED) [nsIPermissionManager.add]
make[1]: *** [permissions] Error 3
make: *** [gaia/profile.tar.gz] Error 2

このような状況になったら、gaia/xulrunner-sdk ディレクトリを削除し、コードを再度 pull してみてください:

rm -r gaia/xulrunner-sdk

これで、ビルドシステムが自動的にダウンロードしたコンパイル済みの XULRunner のコピーが削除されます。次回のビルド時に、XULRunner の新しいコピーが自動的に取得されます。

Cannot fetch platform/libcore

Nexus S 用の B2G ビルド (./config.sh nexus-s) を設定しようとして libcore 関連のエラーが発生する場合、これは、提供者である linaro git の問題です。これを修正するには、下記のように B2G マニフェストを checkout してください:

git clone https://github.com/mozilla-b2g/b2g-manifest.git

リポジトリ内の nexus-s.xml ファイルを修正し、linaro git エントリを asop エントリーに置き換え、下記のようにします:

 

変更をコミット (git commit -a) し、次にチェックアウトしたメイン B2G リポジトリのマスターブランチ内の config.sh ファイルを変更して、Mozilla マニフェストの代わりにあなたが修正したローカルのマニフェストを指すようにします:

GITREPO=${GITREPO:-"file:///home/path/to/my/b2g-manifest"}

Mac で Xcode 5 を使用してビルドする時の clang エラー

Mac OS X 10.8 上の Xcode 5 でビルドする場合、下記の様なエラーを見ることがあります:

clang: error: argument unused during compilation: '-include system/core/include/arch/darwin-x86/AndroidConfig.h'
clang: error: argument unused during compilation: '-U DEBUG'
clang: error: argument unused during compilation: '-U DEBUG'
clang: error: argument unused during compilation: '-MF out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.d'
make: *** [out/host/darwin-x86/obj/EXECUTABLES/obbtool_intermediates/Main.o] Error 1

これは、Xcode 5 が g++ コンパイラを /usr/bin に変更しているのが原因で、コンパイル時にそれを使おうとする時にビルドプロセスが停止します。この問題を回避するには、build/core/combo/HOST_darwin-x86.mk の次の行を編集してください:

HOST_CXX := g++

から

HOST_CXX := g++-4.7
ifeq (,$(wildcard /usr/local/bin/g++-4.7))
 HOST_CXX := g++
endif

に書き換えます。次に、gcc をアンインストールするため、brewを 使います(すでに Mac OS bootstrap script を使っていることを想定しています。そうでない場合は、そのステップを完了しておく必要があります):

brew uninstall gcc-4.7

ここで c++ と multilib をサポートした gcc を再インストールします:

brew install --enable-cxx https://gist.github.com/artlogic/6988658/raw/aeb9d1ea098274ad3f3fe2637b9df7f308a8a120/gcc-4.7.rb

PATH に /usr/local/bin の記載があることを確認してください。次のコマンドで、この環境変数を一時的に設定できます:

export PATH=/usr/local/bin:$PATH

上記をホームディレクトリの .bash_profile に追加しておけば、この変更を永続的にできます。

PATH の設定後、下記コマンドを両方実行してください:

gcc-4.7 -v

g++-4.7 -v

上記のコマンドのいずれかが失敗する場合、次のコマンドのように brew で GCC を再リンクしてください:

brew link --overwrite gcc-4.7

/usr/bin/c++ が Xcode 5 インストール時のように clang++ を指していない場合もありえます。次のコマンドで確認できます:

ls -l /usr/bin/c++

このようなものが返ってくるはずです:

lrwxr-xr-x 1 root admin 7 Sep 19 11:40 /usr/bin/c++ -> clang++

c++ が clang++ 以外を指してる場合は、次のコマンドで更新してください:

sudo rm /usr/bin/c++

sudo ln -s /usr/bin/clang++ /usr/bin/c++

"system/core/include/log/log.h:38:20: error: stdarg.h: No such file or directory"

このエラーは、Mac OSX 10.10 上で 10.6 SDK を使用してビルドする場合に起こります。または、ビルドしようとしているものがビルドコンフィグでサポートされていない他の SDK 設定でも起こります。詳細は、バグ 1071266 を参照してください。

cp: cannot stat '../../../backup-flame/system/lib/libalsa-intf.so': No such file or directory

このエラーは、ビルドシステムがバックアップディレクトリからのファイルを使おうとしてファイルが見つからないときに起こります。このような問題はいくつかの原因が考えられます。

  1. スクリプトが端末からコンピュータへデータを取得している間に USB 接続が壊れた。
  2. 誤ったターゲットをビルドしている (誤った端末または誤ったベースの Android バージョン)。
  3. スクリプトが想定するベースビルドを持っていない。

下記のサブセクションで、詳細な原因を探ります。

Note: The backup directory is a copy of some files from your target device so that the build system can produce a full image, including binary files that we don't have the source for. Usually we can't distribute these files — that's why you need to fetch them from an existing device containing a base build obtained from the vendor.

The USB connection is broken while pulling data

When building, if the backup directory doesn't exist, the script will automatically start fetching the files from your attached device. At the end of this process you should see lines similar to the following:

143 files pulled. 0 files skipped.
3003 KB/s (512036044 bytes in 30.662s)

If you see pulling messages from adb (lines starting with pull) but don't see this, this means the connection was broken before completion. In this case you should delete your backup directory and try building again.

Note: Some base builds will disable adb when the phone is locked. If that's the case for you, you'll need to disable screenlock so that it doesn't lock itself.

You're building for the wrong target

The target is the parameter you gave to the config.sh script in the previous step. To check your configured target, just run:

$ cat .config

And you should get an output like the following:

...
DEVICE_NAME=flame-kk
PRODUCT_NAME=flame

The DEVICE_NAME is what you're looking for. For example, current flame builds should use flame-kk, not flame.

If the DEVICE_NAME is wrong, then you need to reconfigure using config.sh, delete your current backup directory (backup-flame for the flame), and rerun the build script.

エミュレータのビルドの問題

emulator ビルドを作成する時は、下記の問題に注意してください:

重要: x86 エミュレータを使用すべきではありません。インストールが困難であまりサポートされていません。

エミュレータ用のビルドシステムは、32bit と 64bit の両方をビルドします。エミュレータは OpenGL に依存しているため、32bit/64bit 両方の OpenGL ライブラリをシステムにインストールする必要があります (バグ 897727 の議論を参照)。

この問題を解決するには、2 通りの方法があります:

解決策 #1: 32bit と 64bit 両方の OpenGL ライブラリをインストールして正しいシンボリックリンクを保つ

ご使用の linux ディストリビューションに OpenGL ライブラリの multilib パッケージがあれば、それをインストールしてみてください。シンボリックリンクは手動で作ることになるでしょう。

例えば、以下は Ubuntu 12.04 LTS x86-64 の場合です。このディストリビューションでは、 libgl1-mesa-dev パッケージの x86-64 版と i386 版を同時にインストールできません。しかし、下記組み合わせのパッケージを同時インストールできます:

sudo apt-get install libgl1-mesa-dev libglapi-mesa:i386 libgl1-mesa-glx:i386

このコマンドを実行後、エミュレータのビルドを成功させるには、まだ手動でシンボリックリンクを作る必要があります:

sudo ln -s /usr/lib/i386-linux-gnu/libX11.so.6 /usr/lib/i386-linux-gnu/libX11.so
sudo ln -s /usr/lib/i386-linux-gnu/mesa/libGL.so.1 /usr/lib/i386-linux-gnu/libGL.so

解決策 #2: エミュレータにパッチを当てて 64bit 版だけをビルドする

単に このパッチ を B2G リポジトリ下の sdk/ Git リポジトリに適用します。これは、64bit システムでは、B2G エミュレータが 64bit のエミュレータだけをビルドするようにします。 これで、multilib のいかなる問題も回避できます。64bit システムでは、いずれにせよ 32bit エミュレータを使用しません。これは、このパッチが最終的にゴミクズ化(原語:bit-rot)するまでは最もシンプルな解決策です。

Android can only be built by versions 3.81 and 3.82

For Ubuntu you can compile an older version by downloading this version.

Install using the following:

tar xvzf make-dfsg_3.81.orig.tar.gz
cd make-dfsg-3.81.orig/
./configure
make
make check
make install
echo alias make=\'$(pwd)\' >> B2G/.userconfig

次のステップへ

ビルド後の次のステップは、Boot to Gecko をエミュレータ用にビルドしたのか、もしくは実際のモバイル端末用なのかによって異なります。詳細は以下の記事を参照してください:

B2G/B2G OS/Gaia のバグ登録

いったん B2G/B2G OS のビルドを終えて実行できるようになったら、特定バージョンのバグを登録したくなるでしょう。B2G OS コミュニティは可能な限り効率的な改善ができます。Bugzilla でバグを報告 したいときは、"B2G OS" プロジェクトの下に、バージョン情報を含めて報告してください:

  1. 最初に、メジャーバージョン番号、例えば 2.5.0.0-prerelease を教えてください。端末では Settings > Device Information から確認できます。
  2. gaia と gecko リポジトリから現在のハッシュを取得することで、もっと詳細なバージョン ID を報告できます。このようにして:
    #!/bin/bash
    (cd gaia;  echo "gaia  $(git rev-parse HEAD)")
    (cd gecko; echo "gecko $(git rev-parse HEAD)")

ドキュメントのタグと貢献者

 このページの貢献者: hamasaki, T.Ukegawa, Marsf, Uemmra3, taguchi-ch
 最終更新者: hamasaki,