macOSでの camlimages 5.0.1 のビルドに失敗し、それを解決するまで

## 経緯
[SATySFi](https://github.com/gfngfn/SATySFi)を入れ直したら

```
$ opam install satysfi

<><> Synchronising pinned packages ><><><><><><><><><><><><><><><><><><><><><><>
[satysfi.0.0.3] no changes from git+file:///Users/admin/SATySFi#master

The following actions will be performed:
  - install camlimages 5.0.1  [required by satysfi]
  - install satysfi    0.0.3*
===== 2 to install =====
Do you want to continue? [Y/n] y

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[camlimages.5.0.1] found in cache

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[ERROR] The compilation of camlimages failed at
        "/Users/admin/.opam/opam-init/hooks/sandbox.sh build jbuilder build -p
        camlimages -j 4".

#=== ERROR while compiling camlimages.5.0.1 ===================================#
# context     2.0.0 | macos/x86_64 |  | https://opam.ocaml.org#69f81992
# path        ~/.opam/4.05.0/.opam-switch/build/camlimages.5.0.1
# command     ~/.opam/opam-init/hooks/sandbox.sh build jbuilder build -p camlimages -j 4
# exit-code   1
# env-file    ~/.opam/log/camlimages-84418-a00279.env
# output-file ~/.opam/log/camlimages-84418-a00279.out
### output ###
# [...]
# Use Stdlib instead.
# 
# If you need to stay compatible with OCaml < 4.07, you can use the 
# stdlib-shims library: https://github.com/ocaml/stdlib-shims
# File "tiff/tiff.ml", line 127, characters 6-25:
# 127 |       Pervasives.close_in ic;
#             ^^^^^^^^^^^^^^^^^^^
# Alert deprecated: module Stdlib.Pervasives
# Use Stdlib instead.
# 
# If you need to stay compatible with OCaml < 4.07, you can use the 
# stdlib-shims library: https://github.com/ocaml/stdlib-shims



<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+- The following actions failed
| - build camlimages 5.0.1
+- 
- No changes have been performed
```

と言われて上手く行かなかった。エラーメッセージでググってもほとんどなにもヒットしなかった。かなしい。

## 原因その1

SATySFiが要求するOCamlのバージョンが[いつの間にか](https://github.com/gfngfn/SATySFi/commit/baa805764f3ed93e6bfffb05f881fec1a7de0332)4.05.0ではなく4.06.0になっていた。 `opam switch create 4.06.0` をする。

## まだ直らん

```
$ opam install satysfi
The following actions will be performed:
  - install camlimages 5.0.1               [required by satysfi]
  - install satysfi    0.0.3+dev2019.07.14
===== 2 to install =====
Do you want to continue? [Y/n] y

<><> Gathering sources ><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[camlimages.5.0.1] found in cache
[satysfi.0.0.3+dev2019.07.14] synchronised from git+https://github.com/gfngfn/SATySFi.git#b1349fae80e43ac454bbcd9a7101c9988fe6aaa2

<><> Processing actions <><><><><><><><><><><><><><><><><><><><><><><><><><><><>
[ERROR] The compilation of camlimages failed at
        "/Users/admin/.opam/opam-init/hooks/sandbox.sh build jbuilder build -p
        camlimages -j 4".

#=== ERROR while compiling camlimages.5.0.1 ===================================#
# context     2.0.0 | macos/x86_64 | ocaml-base-compiler.4.06.0 | https://opam.ocaml.org#69f81992
# path        ~/.opam/4.06.0/.opam-switch/build/camlimages.5.0.1
# command     ~/.opam/opam-init/hooks/sandbox.sh build jbuilder build -p camlimages -j 4
# exit-code   1
# env-file    ~/.opam/log/camlimages-52267-2dea01.env
# output-file ~/.opam/log/camlimages-52267-2dea01.out
### output ###
# jpegread.c:282:10: warning: assigning to 'JSAMPROW' (aka 'unsigned char *') from 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
# [...]
# jpegread.c:296:10: warning: assigning to 'JSAMPROW' (aka 'unsigned char *') from 'char *' converts between pointers to integer types with different sign [-Wpointer-sign]
#   row[0] = String_val(buf) + Int_val(offset);
#          ^ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
# 2 warnings generated.
#   ocamlmklib tiff/dllcamlimages_tiff_stubs.so,tiff/libcamlimages_tiff_stubs.a (exit 2)
# (cd _build/default && /Users/admin/.opam/4.06.0/bin/ocamlmklib.opt -g -o tiff/camlimages_tiff_stubs tiff/tiffread.o tiff/tiffwrite.o -L/usr/local/Cellar/libtiff/4.0.9_4/lib -ltiff)
# ld: file not found: /usr/local/opt/jpeg/lib/libjpeg.9.dylib for architecture x86_64
# clang: error: linker command failed with exit code 1 (use -v to see invocation)
#   ocamlmklib xpm/dllcamlimages_xpm_stubs.so,xpm/libcamlimages_xpm_stubs.a
# /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: xpm/libcamlimages_xpm_stubs.a(xpmwrite.o) has no symbols
# /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/ranlib: file: xpm/libcamlimages_xpm_stubs.a(xpmwrite.o) has no symbols



<><> Error report <><><><><><><><><><><><><><><><><><><><><><><><><><><><><><><>
+- The following actions failed
| - build camlimages 5.0.1
+- 
- No changes have been performed
```

エラーメッセージは変化したが、ビルドはまだうまくいかない。

## 助け舟

SATySFi slack（[ここ](https://github.com/gfngfn/SATySFi/wiki/SATySFi-Wiki#%E3%82%B3%E3%83%9F%E3%83%A5%E3%83%8B%E3%83%86%E3%82%A3)のリンクから入れる）でsakas-- (Ken Sakayori)さんから以下のようなメッセージを頂いた。

> Camlimagesのインストールで失敗しているのは共通していますが、2つのエラーの内容はだいぶ異なっていますね。
後者だとリンクで失敗しているみたいですが、libjpegはMacにインストールされていますか?

libjpeg、そんなものがあるのか。まあたしかにエラーメッセージをちゃんと読むと `ld: file not found: /usr/local/opt/jpeg/lib/libjpeg.9.dylib for architecture x86_64` って書いてあるんだから、`libjpeg`の不存在を直すのがよいのだなぁ。なるほど。`ld`がリンカであることを知っていながらなぜ思い当たらないのだ私は。

## brew install libjpeg

`brew install libjpeg` をしたところ、「libjpegは入っているけど `brew switch jpeg 9c` するとよいかもね」と言われた。した。直った。

## 結論

エラーメッセージはよく読もう。