GStreamer をビルドする

GStreamer をソースからビルドする方法は 2 通りあります。

それぞれ、以下の OS にて確認しました。

- Debian GNU/Linux 10 (buster)
- Debian GNU/Linux 11 (bullseye)
- Ubuntu 18.04 (Bionic Beaver)
- Ubuntu 20.04 (Focal Fossa)

## Cerbero によるビルド

[Cerbero](https://github.com/GStreamer/cerbero) という独自のクロスプラットフォームビルドアグリゲーターを使ったビルド。必要なパッケージのインストールも自動的におこない、パッケージの作成まで一括して実行してくれます。細かいビルドオプションはなさそうです。あと arm64 アーキではうまくいきませんでした。

参考) [Building from source using Cerbero](https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-cerbero.html?gi-language=c)

### ビルド手順

#### ビルド準備

以下のパッケージがインストールされていない場合は事前にインストールしておきます。

    sudo apt-get update -y
    sudo apt-get install -y git python3 python3-distro python3-setuptools


#### ビルド実行

    git clone -b 1.20.3 https://gitlab.freedesktop.org/gstreamer/cerbero.git
    cd cerbero
    ./cerbero-uninstalled bootstrap -y
    ./cerbero-uninstalled package gstreamer-1.0

ビルド結果は build/dist/linux_(アーキ)/ 配下に出力され、必要なものが gstreamer-1.0-linux-(アーキ)-(バージョン).tar.xz にパッケージ化されます。

#### Debian 10 に関する補足

Debian GNU/Linux 10 (buster) では libkate のコンパイルに失敗しました。

```
/usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/8/../../../x86_64-linux-gnu/libfl.so: undefined reference to `yylex'
```

原因はよく分かりませんが、とりあえず flex の代わりに flex-old をインストールすることでコンパイルできました。ただし逆に flex-old だと失敗するモジュールもあるので、libkate だけ個別にビルドすると良さそうです。

例)

```shell
./cerbero-uninstalled bootstrap -y
sudo apt-get install -y flex-old
./cerbero-uninstalled build libkate
sudo apt-get install -y flex
./cerbero-uninstalled package gstreamer-1.0
```



## Meson によるビルド

[Meson](https://mesonbuild.com/)/[Ninja](https://ninja-build.org/) を使ったビルド。こちらのほうがビルドオプションが細かく設定できるので、必要なものだけビルドしたい場合はこちらが良いです。

参考) [Building from source using Meson](https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-meson.html?gi-language=c)

### ビルド手順

#### ビルド準備

以下のパッケージがインストールされていない場合は事前にインストールしておきます。

    apt-get install -y bison flex git pkg-config python3 python3-pip
    python3 -m pip install meson ninja

その他、プラグインで必要なライブラリがあればインストールしておきます。(必要なライブラリがないプラグインはビルド対象から除外されます。)

#### ビルド実行

    git clone -b 1.20.3 https://gitlab.freedesktop.org/gstreamer/gstreamer.git
    cd gstreamer
    meson build/
    ninja -C build/

### 動作確認

build/ 配下で以下のコマンドを実行すると、ビルドした GStreamer を実行するための環境を設定することができます。

    ninja devenv

### インストール

build/ 配下で以下のコマンドを実行して、ビルドした GSstreamer をインストールします。

    sudo ninja install

### ビルド設定

ビルド設定のオプションは、meson 実行時(build ディレクトリ作成時)に指定します。

    meson (オプション指定) build/

build ディレクトリ作成後に設定を変更する場合は `--reconfigure` をつけます。

    meson --reconfigure (オプション指定) build/

現在の設定を確認するには以下のコマンドを実行します。

    meson configure build/

設定可能なオプションのリストは、ルートと各サブプロジェクト配下 (subproject/xyz/) にそれぞれある meson_options.txt に記述されているので、それを参考にします。例えば `type: 'feature'` と記述されているものは、有効(enable)/無効(disabled)/自動(auto) が指定できます。オプションを指定する場合は meson 実行時に `-D<オプション名>=<値>` (サブプロジェクト配下の設定は `-D(サブプロジェクト名):(オプション名)=(値)`) と指定します。

以下はオプションの一部です。

#### prefix オプション

インストール先を変更します。(未指定時は /usr/local)

    meson -Dprefix=/usr/local/gstreamer build/

#### gpl オプション

(A)GPL ライセンスのプラグインもビルドする場合に指定します。(未指定時はビルドしない)

    meson -Dgpl=enabled build/

#### 共通オプション

以下のオプションは全サブプロジェクトに適用されます。

|オプション名|型|未指定時|説明|
|:--|:--|:--|:--|
|tests|feature|auto|テスト|
|examples|feature|auto|サンプル|
|introspection|feature|auto|イントロスペクションデータを生成|
|nls|feature|auto|NLS (Native Language Support; 翻訳) を有効化|
|orc|feature|auto|ORC (Optimized Inner Loop Runtime Compiler) を有効化|
|doc|feature|auto|API ドキュメントを生成 (hotdoc)|
|gtk_doc|feature|disabled|API ドキュメントを生成 (gtk-doc)|

#### 機能オプション

ビルドする機能、プラグインなどを選択するオプションです。各サブプロジェクトごとに更に細かい単位で選択することもできます。

|オプション名|型|未指定時|説明|
|:--|:--|:--|:--|
|python|feature|auto||
|libav|feature|auto|gst-libav - [FFmpeg プラグイン](https://gstreamer.freedesktop.org/documentation/libav/index.html?gi-language=c)|
|libnice|feature|auto||
|base|feature|enabled|gst-plugins-base - 基本的なプラグインのセット|
|good|feature|enabled|gst-plugins-good - 品質が良いプラグインのセット|
|ugly|feature|auto|gst-plugins-ugly - 品質は問題ないが、ライセンスに注意が必要なプラグインのセット|
|bad|feature|auto|gst-lugins-bad - 品質に課題のあるプラグインのセット|
|devtools|feature|auto||
|ges|feature|auto|gst-editing-services - [GStreamer Editing Services](https://gstreamer.freedesktop.org/documentation/gst-editing-services/)|
|rtsp_server|feature|auto|gst-rtsp-server - [GStreamer RTSP Server](https://gstreamer.freedesktop.org/documentation/gst-rtsp-server/)|
|omx|feature|disabled|gst-omx - OpenMax プラグイン|
|vaapi|feature|disabled|[VAAPI プラグイン](https://gstreamer.freedesktop.org/documentation/vaapi/)|
|sharp|feature|disabled||
|rs|feature|disabled||
|gst-examples|feature|auto|gst-examples|
|tls|feature|auto|glib-networking による TLS サポート|
|qt5|feature|auto|Qt5 サポート|

例) 最小構成

    meson --reconfigure \
        -Dpython=disabled \
        -Dlibav=disabled \
        -Dlibnice=disabled \
        -Dbase=disabled \
        -Dgood=disabled \
        -Dugly=disabled \
        -Dbad=disabled \
        -Ddevtools=disabled \
        -Dges=disabled \
        -Drtsp_server=disabled \
        -Dgst-examples=disabled \
        -Dtls=disabled \
        -Dqt5=disabled \
        build/