macOS上でVLCをソースからビルドする

本記事は東京大学工学部電子情報・電気電子工学科の「[大規模ソフトウェアを手探る](https://doss.eidos.ic.i.u-tokyo.ac.jp/)」という実習の報告書を兼ねています。

# はじめに

[VLC](https://www.videolan.org/vlc/)は非常に多くのフォーマットに対応したマルチメディアプレーヤーです。我々の班は実習で「VLCで字幕を2言語同時に表示できるよう改造する」ことを目標にVLCを手探ることにしました。(詳しくは[この記事](https://qiita.com/grayarea/items/3db1c354bb8f7f65e4eb ))本記事では、自分のPC上でVLCをビルドし、デバッガで手探れる状態にするところまでを解説します。

VLCは大規模なソフトウェアですが、(何事もなければ)簡単にビルドすることができます。早速、ビルドの方法を見ていきましょう。

# 環境

本記事では以下の環境を前提としています。

* macOS 10.13 High Sierra or macOS 10.14 Mojave
* VLC 4.0.0 ([2018/10/3時点のmaster](https://git.videolan.org/?p=vlc.git;a=commit;h=e62999a6b1ccdf6b03204f486ec348eec7931922))

# ソースコードの取得

まずはソースコードを取得してきましょう。Gitリポジトリが公開されているので、gitコマンドを用いてソースコードを落とします。

```bash
git clone https://git.videolan.org/git/vlc.git
```

# ビルド

クローンが終わったら、`vlc`ディレクトリに移動しビルド用のディレクトリ`build`を作成します。作業ファイルを置いたり、ビルドされた実行ファイルやVLC.appなどを配置するためのディレクトリです。

```bash
mkdir vlc/build
cd vlc/build
```

VLCでは、コマンド1発で全てのビルドを行なってくれる便利なスクリプトがあるので、今回はこれを利用することにします。

```bash
VLC_CONFIGURE_ARGS="--enable-debug --disable-optimizations"  ../extras/package/macosx/build.sh -C .
```

`../extras/package/macosx/build.sh`というのが、便利スクリプトです。各オプションの意味は次の通りです。

<dl>
<dt>VLC_CONFIGURE_ARGS</dt>
<dd>VLC本体のビルドを行う直前に実行されるconfigureスクリプトに対するオプションはここに代入します。</dd>
<dt>--enable-debug</dt>
<dd>ランタイムアサーションが行われるようになり、自分のした変更によりおかしな挙動をしたら(orする直前に)実行を止めてくれます。これによってデバッグしやすくなります。</dd>
<dt>--disable-optimizations</dt>
<dd>コード最適化を抑制します。これにより、デバッガで追跡する際、最適化により変数の値が見えなくなったり、実行順序がソースコード通りで無くなることが防げます。</dd>
<dt>-C .</dt>
<dd>ビルドの成果物を置くディレクトリを指定します。ここでは`build`ディレクトリの中でカレントディレクトリを指定しているので、`build`ディレクトリ以下に実行ファイルなどが置かれます。</dd>
</dl>

何事もなければ以上でビルドは終了です。お疲れ様でした。

# macOS 10.14 Mojaveの場合

`build.sh`を実行すると、

* ビルドに必要なコマンド群(extras/tools)
* VLCが利用している依存パッケージ群(contrib)
* VLC本体

の3つがビルドされます。このうちcontribは通常、時間短縮のためビルド済みのものが利用されるのですが、Mojave用のビルド済みアーカイブが本稿執筆時点ではまだ存在していません。[^mojave-contrib]仕方がないので、全部自前でビルドしましょう。この場合、`build.sh`に`-c`オプションを与えればOKです。コマンドは以下のようになります。

```bash
VLC_CONFIGURE_ARGS="--enable-debug --disable-optimizations"  ../extras/package/macosx/build.sh -C . -c
```

[^mojave-contrib]: Mojaveに対応するdarwinのバージョンは18ですが、`x86_64-apple-darwin17 `までしか存在してません。https://download.videolan.org/videolan/contrib/

# 困った時は

何事もなくビルドが済めば良いのですが、そうもいかないこともあります。私たちが遭遇したトラブルとその対処法を紹介しておきますので、参考にしてみてください。

## ビルドが失敗した! しかし何処でエラーになったのかわからない...

VLCのビルドに失敗した時最も多くの人が抱くであろう感想はこれだと思います。ビルド用のツールや依存パッケージのビルドをする際、`build.sh`は複数のソフトウェアのビルドを並列に走らせます。このため互いに関係のないログ同士が同時に流れることになり、問題の把握を困難にしています。

このような時は、並列度を1にするオプションを活用しましょう。`build.sh`に`-j1`というオプションを与えればOKです。

```bash
VLC_CONFIGURE_ARGS="--enable-debug --disable-optimizations"  ../extras/package/macosx/build.sh -C . -c -j1
```

ちなみに、contribのビルドでコケるという状況で原因を探るため並列度を1にしたら、なぜかビルドに成功してしまった事例もありました。[^build-j1]

[^build-j1]: きちんと調べていないため推測ですが、(ビルドの順序が適切に指定されておらず)並列にビルドすることで依存元のパッケージが出来上がる前に依存先のビルドが始まってしまった、ということがあったのかもしれません。

## 原因を潰してビルドをやり直しても成功しない

一度リポジトリを全て消して、クローンし直してから再度ビルドするとうまくいくことがあります。`build.sh`を走らせるとあちこちにファイルがばら撒かれるので、全部消したほうが早いです。

## どのパッケージのビルドでコケているかはわかるが、それ以上の情報を得たい

contribのビルドにおいて、どのパッケージのビルドで失敗しているかはわかったが、実行されているコマンドなどを逐一確認して原因を探りたい、という場合もあると思います。その場合はcontribディレクトリ以下から所望のパッケージを探します。Makefileなどが生成されているはずなので、`make V=1`[^autotool-make]などすれば、詳細なログを見ることができます。

[^autotool-make]: https://qiita.com/koara-local/items/4e047e47b8cde52919a6

# 参考

* https://wiki.videolan.org/OSXCompile/
    * 公式なビルド方法の記事です。build.shを利用しない方法も紹介されています。