cerberoを使ってVS2015でGStreamerをビルドする

最近のGstreamerはWindowsでどのようにビルドするのかを調べていたところ、



- 「GStreamerとMeson。新たなる希望」http://blog.nirbheek.in/2016/05/gstreamer-and-meson-new-hope.html

なる記事に当たった。

[cerbero](https://github.com/centricular/cerbero)という依存アプリを含めてソースをダウンロードしながら自動ビルドするシステムを作ったらしい。
記事では、gentooに言及したりしているので期待が持てそう。
Mesonというのは[Ninja](https://ninja-build.org/)のフロントエンドでGStreamerのビルドに使うみたい。
cerberoはGStreamerをビルドするときはMesonを呼び出すいうことか。

Windows10(64bit)でGstreamerのビルドをやってみる。

# cerberoの手順に従ってWindows環境を準備する

- https://github.com/centricular/cerbero

をcloneする。
cerbero自身はpython2のスクリプト。

- python2.7
- python3.6(3.5だとconsoleのcodepageの扱いで非英語のWindowsでエラーになる)
- git
- cmake
- MSYS/MinGW

あたりを
https://github.com/centricular/cerbero#windows
に書いてある通りに導入する。
コマンドラインはmsysを使えということなのだろうか。

# msys shellを整える

## minttyはerror時のpromptでメニューが出ずに固まることが分かったので中止

```
Recipe 'gst-plugins-bad-1.0' failed at the build step 'compile'
Select an action to proceed:
[0] Enter the shell
[1] Rebuild the recipe from scratch
[2] Rebuild starting from the failed step
[3] Skip recipe
[4] Abort
```
minttyだとこれが出ずに固まる。


## shell開始用のショートカットを作る

```
D:\MinGW\msys\1.0\msys.bat 
```

## 環境変数
以下のようなPATHを綺麗にするログインスクリプトを作った。
同じ名前のコマンドがヒットしないようにPATHの順番にも注意する必要がある(間違えてmsys-gccをインストールしちゃった)。

```bash:msysの~/.profile
PATH=""
PATH="${PATH}:/D/dev/_build/cerbero/build/mingw/w64/bin"
PATH="${PATH}:/usr/local/bin"
PATH="${PATH}:/mingw/bin"
PATH="${PATH}:/usr/bin"
PATH="${PATH}:/D/tools/cmake-3.7.2-win64-x64/bin"
PATH="${PATH}:/D/Git/bin"
#PATH="${PATH}:/d/Python35/Scripts:/d/Python35:/d/Python27:/C/Windows/System32"
PATH="${PATH}:/d/Python36/Scripts:/d/Python36:/d/Python27:/C/Windows/System32"
export PATH

if [ -e $HOME/.bashrc ];then
	source $HOME/.bashrc
fi
```

##gitの設定
user.emailとuser.nameの設定が無くてcloneに失敗する場合があるので。

```
$ git config --global user.email "user@host"
$ git config --global user.name "user"
```

##並行ビルドの設定
makeの-jオプションの引数になる。ドキュメントの記述が見つからなかったのでソースを見て勘で作った。
コア数に応じて適当にどうぞ。

```python:~/.cerbero/cerbero.cbc
allow_parallel_build=True
num_of_cpus=8
```

# bootstrap

```sh
$ python2 ./cerbero-uninstalled -c config/win64-mixed-msvc.cbc bootstrap
```

gccをダウンロードしてMinGW版のgettextとかiconvをビルドするので、msysのconfigureが遅いのもあって長い。1時間以上かかった。あと、cerbero directoryをアンチウイルスの対象外にせよとのアドバイスがあった(非常に遅くなり、時にはビルドが途中で失敗するそうな)。

# build gstreamer

```
$ python2 ./cerbero-uninstalled -c config/win64-mixed-msvc.cbc build gst-plugins-base-1.0
```

うまくいった。
Windowsでautovideosinkがうごくようにしたいのでgoodとbadもやってみる。

```
$ python2 ./cerbero-uninstalled -c config/win64-mixed-msvc.cbc build gst-plugins-good-1.0
$ python2 ./cerbero-uninstalled -c config/win64-mixed-msvc.cbc build gst-plugins-bad-1.0
```

```sh
$ /d/dev/_build/cerbero/build/dist/windows_x86_64/bin/gst-launch-1.0.exe -v videotestsrc ! autovideosink
```


無事動いた。
![d3dvideosink.png](https://qiita-image-store.s3.amazonaws.com/0/59664/cb373777-b3a8-9ec0-4375-ef4f718b8b11.png)


# visualstudioのprojectを出力できるらしい？
- https://github.com/centricular/cerbero-docs/blob/master/start.md#generating-visual-studio-projects-and-solutions-

# まとめ
うまく動いていると思う。
Glibというよりもgettext周り(libintl)のビルドが厄介なので、そこがクリアされているのは有用かなと。
だが、動作を見てみるとGlibより下はMinGW64のGCCでビルドしているみたいだ。

- http://blog.nirbheek.in/2016/07/building-and-developing-gstreamer-using.html

によると下記の部分はMSVCビルドらしい。

- bzip2.recipe
- orc.recipe
- libffi.recipe (only 32-bit)
- glib.recipe
- gstreamer-1.0.recipe
- gst-plugins-base-1.0.recipe
- gst-plugins-good-1.0.recipe
- gst-plugins-bad-1.0.recipe
- gst-plugins-ugly-1.0.recipe

```
config/win64-mixed-msvc.cbc
```

のmixedというのはそういうことか。
混ぜていいんだっけ？。
static runtimeじゃなければよいのかな。

configを見ると、

```
config/win64-pure-msvc.cbc
```
というのもある。こっちは全部msvcでがんばってくれそう・・・。
今後、recipeが充実していけばかなりよくなるんでなかろうか。

# リンク
cerberoにrecipeを追加する例

- [cerberoを使ってlibfluidsynthをAndroid用にビルドする](http://qiita.com/atsushieno/items/331b76b08b7f9b4aca0f)

GStreamerにもcerberoビルドについて書いてあった

- https://gstreamer.freedesktop.org/documentation/installing/building-from-source-using-cerbero.html

Mesonについて

- http://hellolibraryworld.blogspot.jp/2016/12/the-meson-build-system.html