<commit_before># WebRTC ライブラリ用ビルドツール

iOS と Android 向けの WebRTC ライブラリをビルドします。WebRTC ライブラリのビルドは複雑でわかりにくいです。
また WebRTC ライブラリのバージョンが上がるごとにビルド方法が変わることも多く、追従するのは現実的ではありませんでした。

このツールはもともと[株式会社時雨堂](https://shiguredo.jp)の社内ツールでしたが、
少しでも WebRTC ライブラリに追従する負荷を削減できればと思い公開することにしました。

## 注意

このビルドツールの主な目的は[株式会社時雨堂](https://shiguredo.jp)の製品である [WebRTC SFU Sora](https://sora.shiguredo.jp) の SDK 利用のために開発されています。
そのため、目的を越えた汎用的なビルドツールにする予定はありません。リソースの都合上、バグ報告以外の PR に対応できるとは限りませんのでご了承ください。

## 方針

Chrome の安定版のバージョンに合わせて追従していきます。 master ブランチやリリースブランチの HEAD への追従は行いません。

## ダウンロード

実行可能なビルドツールは [Releases](https://github.com/shiguredo/sora-webrtc-build/releases) からダウンロードできます (ビルド済みの WebRTC ライブラリではありません) 。
リポジトリを clone する必要はありません。

## ビルドのシステム条件

Android のビルドは Linux のみサポートされているため、一台の Mac で iOS/Android の両方のビルドはできません。

- Go 1.9.2+ (``webrtc-build`` コマンドをビルドする場合)
- iOS
  - Mac OS X 10.12.6+
  - Xcode 9.0+
  - Python 2.7
- Android
  - Ubuntu Linux 16.04 64bit
  - Python 2.7

## バージョン表記について

バージョンは「メジャー.マイナー.メンテナンス」で表します。

- メジャーバージョン: WebRTC ライブラリのリリースブランチ番号を表します。
- マイナーバージョン: WebRTC ライブラリのコミットポジション番号を表します。 コミットポジション番号とは WebRTC ライブラリでリビジョンごとに割り振られる数値です。 リリースブランチ作成時のコミットポジションは 1 であるため、マイナーバージョンは常に 1 から始まります。
- メンテナンスバージョン: WebRTC ライブラリ以外の変更を加えたときに上がります。

[6d56d2e](https://chromium.googlesource.com/external/webrtc/+/6d56d2ebf0e40bc73dee99093ac7c223ddc7b6e5) を例にすると、リリースブランチ番号が 59 、コミットポジション番号が 4 なので、バージョンは 59.4.x になります。

## 仕様

- 対応する WebRTC のバージョン: M63
- 対応するアーキテクチャ: arm64/armv7 (iOS), armeabi-v7a/arm64-v8a (Android)
- VP9 対応 (可否を指定可)
- (iOS) Bitcode 対応 (可否を指定可)

## 使い方

``webrtc-build`` コマンドを使います。

``webrtc-build`` コマンドをソースコードからビルドするには ``make`` を実行します。 Go のインストールが必要です。

```
$ make
```

``webrtc-build`` の主なサブコマンドは以下の通りです。
``fetch`` と ``build`` を順に実行してください。

### コマンドラインオプション

- ``-h``: ヘルプメッセージを表示します。

- ``-config`: 設定ファイルを指定します。デフォルトは ``config.json`` です。

### ``fetch``

``fetch`` は WebRTC ライブラリのソースコードと、ビルドに必要なツール [depot_tools](https://www.chromium.org/developers/how-tos/depottools) をダウンロードします。

ソースコードのダウンロードは非常に時間がかかります。
途中で中断してしまっても、再度実行すれば途中から再開できます。

### ``build``

``build`` は設定ファイル (``config.json``) で指定されたパッチをソースコードに当ててからビルドします。ビルドの成果物は ``webrtc/build`` ディレクトリ以下にあります。

実行するプラットフォームによってビルド対象が異なります。
Mac OS X では iOS 向け、 Linux では Android 向けのライブラリがビルドされます。

### ``clean``

``clean`` はビルドの成果物を削除し、パッチを当てたソースコードを元の状態に戻します。

## Android ライブラリのビルドについて

Android 向けのビルドはいくつか注意点があります。

- 実行時のシェルは Bash を推奨します。 Zsh だとビルドエラーになる場合がありました。

- 初回の ``./webrtc-build fetch`` は途中で失敗します。これは Google Play ライブラリのライセンスの同意を求める処理によるもので、 ``webrtc`` ディレクトリ下で ``./depot_tools/gclient sync`` してライセンスに同意してください。ライセンスに同意後にダウンロードが再開されます。ダウンロードに成功したら、再度 ``./webrtc-build fetch`` を実行してください。

以上を踏まえて、ビルドは次の手順で行います。

1. シェルを Bash に変更する

2. ``./webrtc-build fetch`` を実行する。初回はライセンスの同意を求める処理で止まります

3. ``webrtc`` ディレクトリ下で ``gclient sync`` を実行し、途中で表示されるライセンスに同意する。初回以降は不要です

   ```
   $ cd webrtc
   $ PATH=./depot_tools:$PATH gclient sync
   ```

4. 再度 ``./webrtc-build fetch`` を実行する

5. ``./webrtc-build build`` を実行する

## ビルドの設定

``config.json`` でビルドの設定が可能です。
リリースブランチやリビジョンを変更したときは、 ``update`` または ``all`` で既存のソースコードへの変更を破棄してから更新しておくとビルドの失敗を防げます。

- ``webrtc_branch``: リリースブランチ番号。

- ``webrtc_commit``: コミットポジション番号。 **ソースコードのダウンロードには影響しません。**

- ``webrtc_revision``: リビジョン番号。リリースブランチの取得後、指定したリビジョンをチェックアウトします。

- ``maint_version``: ``config.json`` 用のメンテナンスバージョン。ビルド設定を更新した場合などに変更してください。

- ``python``: Python のパス。 WebRTC のソースコードに含まれるビルドスクリプトで使われます。

- ``ios_arch``: iOS ライブラリでサポートするアーキテクチャ。 ['arm64', 'arm', 'x64', 'x86'] から複数選択可能です。ただし、シミュレーター向けのビルドはできますが、動作はサポートされていません。

- ``ios_targets``: iOS ライブラリのビルド対象。複数選択可能です。

  - ``framework``: フレームワーク

  - ``static``: 静的ライブラリ

- ``ios_bitcode``: Bitcode の可否。 Bitcode を有効にすると、ビルドしたバイナリのサイズが数百 MB になる可能性があります。

- ``android_arch``: Android ライブラリでサポートするアーキテクチャ。 ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'] から複数選択可能です。

- ``build_config``: ビルドの用途。複数選択可能です。

  - ``debug``: デバッグ用

  - ``release``: リリース用

- ``vp9``: VP9 の可否。

- ``apply_patch``: パッチの適用の可否。

- ``patches``: 適用するパッチのリスト。各パッチのフォーマットは次の要素を持つ辞書です。

  - ``patch``: 適用するパッチのパス。パッチは ``patch`` ディレクトリに置いてください。

  - ``target``: パッチを適用するファイル。 ``webrtc/src`` 以下のファイルを指定します。

## ビルド情報 (iOS)

ビルド時の情報は `build_info.json` に保存されます。フレームワークには ``build_info.json`` が含まれています。

- `webrtc_version` (string): WebRTC のリリースブランチ番号
- `webrtc_revision` (string): WebRTC のリビジョン番号

## トラブルシューティング

ビルドエラーの大半は depot_tools が原因である可能性が高いです。
エラーが出たら、まず次の処理を試してみてください。

- **(特に Android) シェルを Bash に変更する**

- ``./webrtc-build fetch`` を実行する

- ``webrtc`` ディレクトリで ``gclient runhooks`` を実行する

### depot_tools のコマンド (gclient など) を使いたい

``./webrtc-build fetch`` でダウンロードした depot_tools は ``webrtc/depot_tools`` にダウンロードされます。コマンド検索パスにディレクトリを追加します。

例: ``webrtc/src`` ディレクトリで depot_tools のコマンドを使う場合

```
export PATH=../depot_tools:$PATH
```

### ``./webrtc-build fetch``: 実行が途中で止まってしまった

再度 ``./webrtc-build fetch`` を実行してください。
``./webrtc-build fetch`` は何度実行しても問題ありません。

### ``./webrtc-build fetch``: ``stderr:error: Your local changes to the following files would be overwritten by checkout``

パッチの適用後に ``./webrtc-build fetch`` を実行すると、リポジトリに変更があるために指定のリビジョンをチェックアウトできずにエラーになります。
``./webrtc-build clean`` を実行して、リポジトリの変更を戻してから再度 ``./webrtc-build fetch`` を実行してください。

### ``./webrtc-build fetch``: ``stdout:Do you accept the license for version 11.2.0 of the Google Play services client library? [y/n]``<commit_msg>fetch のライセンス y が不要なことを記述する<commit_after># WebRTC ライブラリ用ビルドツール

iOS と Android 向けの WebRTC ライブラリをビルドします。WebRTC ライブラリのビルドは複雑でわかりにくいです。
また WebRTC ライブラリのバージョンが上がるごとにビルド方法が変わることも多く、追従するのは現実的ではありませんでした。

このツールはもともと[株式会社時雨堂](https://shiguredo.jp)の社内ツールでしたが、
少しでも WebRTC ライブラリに追従する負荷を削減できればと思い公開することにしました。

## 注意

このビルドツールの主な目的は[株式会社時雨堂](https://shiguredo.jp)の製品である [WebRTC SFU Sora](https://sora.shiguredo.jp) の SDK 利用のために開発されています。
そのため、目的を越えた汎用的なビルドツールにする予定はありません。リソースの都合上、バグ報告以外の PR に対応できるとは限りませんのでご了承ください。

## 方針

Chrome の安定版のバージョンに合わせて追従していきます。 master ブランチやリリースブランチの HEAD への追従は行いません。

## ダウンロード

実行可能なビルドツールは [Releases](https://github.com/shiguredo/sora-webrtc-build/releases) からダウンロードできます (ビルド済みの WebRTC ライブラリではありません) 。
リポジトリを clone する必要はありません。

## ビルドのシステム条件

Android のビルドは Linux のみサポートされているため、一台の Mac で iOS/Android の両方のビルドはできません。

- Go 1.9.2+ (``webrtc-build`` コマンドをビルドする場合)
- iOS
  - Mac OS X 10.12.6+
  - Xcode 9.0+
  - Python 2.7
- Android
  - Ubuntu Linux 16.04 64bit
  - Python 2.7

## バージョン表記について

バージョンは「メジャー.マイナー.メンテナンス」で表します。

- メジャーバージョン: WebRTC ライブラリのリリースブランチ番号を表します。
- マイナーバージョン: WebRTC ライブラリのコミットポジション番号を表します。 コミットポジション番号とは WebRTC ライブラリでリビジョンごとに割り振られる数値です。 リリースブランチ作成時のコミットポジションは 1 であるため、マイナーバージョンは常に 1 から始まります。
- メンテナンスバージョン: WebRTC ライブラリ以外の変更を加えたときに上がります。

[6d56d2e](https://chromium.googlesource.com/external/webrtc/+/6d56d2ebf0e40bc73dee99093ac7c223ddc7b6e5) を例にすると、リリースブランチ番号が 59 、コミットポジション番号が 4 なので、バージョンは 59.4.x になります。

## 仕様

- 対応する WebRTC のバージョン: M63
- 対応するアーキテクチャ: arm64/armv7 (iOS), armeabi-v7a/arm64-v8a (Android)
- VP9 対応 (可否を指定可)
- (iOS) Bitcode 対応 (可否を指定可)

## 使い方

``webrtc-build`` コマンドを使います。

``webrtc-build`` コマンドをソースコードからビルドするには ``make`` を実行します。 Go のインストールが必要です。

```
$ make
```

``webrtc-build`` の主なサブコマンドは以下の通りです。
``fetch`` と ``build`` を順に実行してください。

### コマンドラインオプション

- ``-h``: ヘルプメッセージを表示します。

- ``-config`: 設定ファイルを指定します。デフォルトは ``config.json`` です。

### ``fetch``

``fetch`` は WebRTC ライブラリのソースコードと、ビルドに必要なツール [depot_tools](https://www.chromium.org/developers/how-tos/depottools) をダウンロードします。

ソースコードのダウンロードは非常に時間がかかります。
途中で中断してしまっても、再度実行すれば途中から再開できます。

### ``build``

``build`` は設定ファイル (``config.json``) で指定されたパッチをソースコードに当ててからビルドします。ビルドの成果物は ``webrtc/build`` ディレクトリ以下にあります。

実行するプラットフォームによってビルド対象が異なります。
Mac OS X では iOS 向け、 Linux では Android 向けのライブラリがビルドされます。

### ``clean``

``clean`` はビルドの成果物を削除し、パッチを当てたソースコードを元の状態に戻します。

## Android ライブラリのビルドについて

Android 向けのビルドはいくつか注意点があります。

- 実行時のシェルは Bash を推奨します。 Zsh だとビルドエラーになる場合がありました。

- 初回の ``./webrtc-build fetch`` は途中で失敗します。これは Google Play ライブラリのライセンスの同意を求める処理によるもので、 ``webrtc`` ディレクトリ下で ``./depot_tools/gclient sync`` してライセンスに同意してください。ライセンスに同意後にダウンロードが再開されます。ダウンロードに成功したら、再度 ``./webrtc-build fetch`` を実行してください。

以上を踏まえて、ビルドは次の手順で行います。

1. シェルを Bash に変更する

2. ``./webrtc-build fetch`` を実行する。初回はライセンスの同意を求める処理で止まります

3. ``webrtc`` ディレクトリ下で ``gclient sync`` を実行し、途中で表示されるライセンスに同意する。初回以降は不要です

   ```
   $ cd webrtc
   $ PATH=./depot_tools:$PATH gclient sync
   ```

4. 再度 ``./webrtc-build fetch`` を実行する

5. ``./webrtc-build build`` を実行する

## ビルドの設定

``config.json`` でビルドの設定が可能です。
リリースブランチやリビジョンを変更したときは、 ``update`` または ``all`` で既存のソースコードへの変更を破棄してから更新しておくとビルドの失敗を防げます。

- ``webrtc_branch``: リリースブランチ番号。

- ``webrtc_commit``: コミットポジション番号。 **ソースコードのダウンロードには影響しません。**

- ``webrtc_revision``: リビジョン番号。リリースブランチの取得後、指定したリビジョンをチェックアウトします。

- ``maint_version``: ``config.json`` 用のメンテナンスバージョン。ビルド設定を更新した場合などに変更してください。

- ``python``: Python のパス。 WebRTC のソースコードに含まれるビルドスクリプトで使われます。

- ``ios_arch``: iOS ライブラリでサポートするアーキテクチャ。 ['arm64', 'arm', 'x64', 'x86'] から複数選択可能です。ただし、シミュレーター向けのビルドはできますが、動作はサポートされていません。

- ``ios_targets``: iOS ライブラリのビルド対象。複数選択可能です。

  - ``framework``: フレームワーク

  - ``static``: 静的ライブラリ

- ``ios_bitcode``: Bitcode の可否。 Bitcode を有効にすると、ビルドしたバイナリのサイズが数百 MB になる可能性があります。

- ``android_arch``: Android ライブラリでサポートするアーキテクチャ。 ['armeabi-v7a', 'arm64-v8a', 'x86', 'x86_64'] から複数選択可能です。

- ``build_config``: ビルドの用途。複数選択可能です。

  - ``debug``: デバッグ用

  - ``release``: リリース用

- ``vp9``: VP9 の可否。

- ``apply_patch``: パッチの適用の可否。

- ``patches``: 適用するパッチのリスト。各パッチのフォーマットは次の要素を持つ辞書です。

  - ``patch``: 適用するパッチのパス。パッチは ``patch`` ディレクトリに置いてください。

  - ``target``: パッチを適用するファイル。 ``webrtc/src`` 以下のファイルを指定します。

## ビルド情報 (iOS)

ビルド時の情報は `build_info.json` に保存されます。フレームワークには ``build_info.json`` が含まれています。

- `webrtc_version` (string): WebRTC のリリースブランチ番号
- `webrtc_revision` (string): WebRTC のリビジョン番号

## トラブルシューティング

ビルドエラーの大半は depot_tools が原因である可能性が高いです。
エラーが出たら、まず次の処理を試してみてください。

- **(特に Android) シェルを Bash に変更する**

- ``./webrtc-build fetch`` を実行する

- ``webrtc`` ディレクトリで ``gclient runhooks`` を実行する

### depot_tools のコマンド (gclient など) を使いたい

``./webrtc-build fetch`` でダウンロードした depot_tools は ``webrtc/depot_tools`` にダウンロードされます。コマンド検索パスにディレクトリを追加します。

例: ``webrtc/src`` ディレクトリで depot_tools のコマンドを使う場合

```
export PATH=../depot_tools:$PATH
```

### ``./webrtc-build fetch``: 実行が途中で止まってしまった

再度 ``./webrtc-build fetch`` を実行してください。
``./webrtc-build fetch`` は何度実行しても問題ありません。

### ``./webrtc-build fetch``: ``stderr:error: Your local changes to the following files would be overwritten by checkout``

パッチの適用後に ``./webrtc-build fetch`` を実行すると、リポジトリに変更があるために指定のリビジョンをチェックアウトできずにエラーになります。
``./webrtc-build clean`` を実行して、リポジトリの変更を戻してから再度 ``./webrtc-build fetch`` を実行してください。

### ``./webrtc-build fetch``: ``stdout:Do you accept the license for version 11.2.0 of the Google Play services client library? [y/n]``

**解決済み** at `1a26057` : y を stdin に流し込むように変更した。
{'fraction_non_alphanumeric': 0.14517029592406477, 'fraction_numerical': 0.017308766052484645, 'mean_word_length': 5.9831059129304744, 'pattern_counts': {'":': 0, '<': 3, '<?xml version=': 0, '>': 3, 'https://': 12, 'lorem ipsum': 0, 'www.': 2, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '271838', 'n_tokens_mistral': 7747, 'n_tokens_neox': 7250, 'n_words': 817}