SATySFi のインストールチャレンジ(v0.0.6)

SATySFi v0.0.6 のインストールに少しばかり苦戦した話。

```
$ uname -r
5.4.72-microsoft-standard-WSL2
```

SATySFi のインストールはソースコードからするものと、satyrographos というパッケージマネージャーを使ってインストールする方法があります。どちらでも躓きましたので、メモに書き残しておきます。最後に参考文献を載せておきますので、詳しく知りたい方はそちらを参照してください。

# 概要
- ソースコードの v0.0.6 からのインストールは、`omd` との依存関係により上手く行きません。インストール時に`omd`のバージョンに制約をかける必要があります。既にこの問題は修正されているので、master からインストールする人は問題がないと思います。
- satyrographos を使ったインストールでは`pkg-config`が無いと怒られるので、それをインストールしましょう。

# ソースコードからインストール

ocaml のバージョンの推奨は 4.10.0 ですが私は 4.12.0 をインストールしています。

```
$ sudo apt update -y && sudo apt upgrade -y
$ sudo apt install opam

$ opam init
$ eval $(opam env)

$ ocaml --version
The OCaml toplevel, version 4.08.1

$ opam switch create 4.12.0
$ eval $(opam env)
$ ocaml --version
The OCaml toplevel, version 4.12.0


$ opam repository add satysfi-external https://github.com/gfngfn/satysfi-external-repo.git

$ mkdir SATySFi
$ cd SATySFi
$ wget https://github.com/gfngfn/SATySFi/archive/refs/tags/v0.0.6.tar.gz
$ tar -xzvf v0.0.6.tar.gz
$ cd SATySFi-0.0.6/
```

```
$ opam pin add satysfi .
#=== ERROR while compiling satysfi.0.0.6 ======================================#
# context     2.0.5 | linux/x86_64 | ocaml-base-compiler.4.12.0 | pinned(file:///home/blank71/SATySFi/SATySFi-0.0.6)
# path        ~/.opam/4.12.0/.opam-switch/build/satysfi.0.0.6
# command     ~/.opam/opam-init/hooks/sandbox.sh build make -f Makefile PREFIX=/home/blank71/.opam/4.12.0
# exit-code   2
# env-file    ~/.opam/log/satysfi-30433-d79b64.env
# output-file ~/.opam/log/satysfi-30433-d79b64.out
### output ###
# [...]
# Entering directory '/home/blank71/.opam/4.12.0/.opam-switch/build/satysfi.0.0.6/tools/gencode'
# Entering directory '/home/blank71/.opam/4.12.0/.opam-switch/build/satysfi.0.0.6/tools/gencode'
# dune exec --root tools/gencode ./gencode.exe -- --gen-text-mode-prims > src/frontend/__primitives_text_mode.gen.ml
# Entering directory '/home/blank71/.opam/4.12.0/.opam-switch/build/satysfi.0.0.6/tools/gencode'
# Entering directory '/home/blank71/.opam/4.12.0/.opam-switch/build/satysfi.0.0.6/tools/gencode'
# dune build
#       menhir src/parser.{ml,mli}
# Warning: 2 states have shift/reduce conflicts.
# Warning: 2 shift/reduce conflicts were arbitrarily resolved.
# File "src/md/decodeMD.ml", line 17, characters 17-25:
# Error: Unbound type constructor Omd.name
# make: *** [Makefile:47: all] Error 1
```


怒られました。原因は [Restrict omd version to fix build by amutake · Pull Request #264 · gfngfn/SATySFi](
https://github.com/gfngfn/SATySFi/pull/264) です。omd のバージョンが進んでしまったせいで、うまくインストールができません。omd のバージョンを指定します。

```
$ vim satysfi.opam 
## L38
## "omd"
## ->
## "omd" {< "2.0.0~"}
## と書き換え。
```

```
$ opam pin add satysfi .
## 無事インストールができます。
```

セットアップ

```
$ ./download-fonts.sh
$ sudo ./install-libs.sh
```

これで完了です。試しに demo.stay を使って PDF に出力してみましょう。

```
$ cd demo/
$ satysfi demo.saty
$ satysfi demo.saty
 ---- ---- ---- ----
  target file: 'demo.pdf'
  dump file: 'demo.satysfi-aux' (will be created)
  parsing 'demo.saty' ...
  parsing 'stdjabook.satyh' ...
  parsing 'pervasives.satyh' ...
  parsing 'gr.satyh' ...
  parsing 'geom.satyh' ...
  parsing 'list.satyg' ...
  parsing 'option.satyg' ...
  parsing 'math.satyh' ...
  parsing 'code.satyh' ...
  parsing 'color.satyh' ...
  parsing 'vdecoset.satyh' ...
  parsing 'annot.satyh' ...
  parsing 'footnote-scheme.satyh' ...
  parsing 'itemize.satyh' ...
  parsing 'tabular.satyh' ...
  parsing 'proof.satyh' ...
  parsing 'local.satyh' ...
  parsing 'hdecoset.satyh' ...
 ---- ---- ---- ----
  type checking 'color.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'pervasives.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'option.satyg' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'geom.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'list.satyg' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'gr.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'tabular.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'annot.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'footnote-scheme.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'hdecoset.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'itemize.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'math.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'proof.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'vdecoset.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'code.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'stdjabook.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'local.satyh' ...
  type check passed.
 ---- ---- ---- ----
  type checking 'demo.saty' ...
  type check passed. (document)
  preprocessing 'color.satyh' ...
  preprocessing 'pervasives.satyh' ...
  evaluating 'option.satyg' ...
  preprocessing 'geom.satyh' ...
  evaluating 'list.satyg' ...
  preprocessing 'gr.satyh' ...
  preprocessing 'tabular.satyh' ...
  preprocessing 'annot.satyh' ...
  preprocessing 'footnote-scheme.satyh' ...
  preprocessing 'hdecoset.satyh' ...
  preprocessing 'itemize.satyh' ...
  preprocessing 'math.satyh' ...
  preprocessing 'proof.satyh' ...
  preprocessing 'vdecoset.satyh' ...
  preprocessing 'code.satyh' ...
  preprocessing 'stdjabook.satyh' ...
  preprocessing 'local.satyh' ...
  preprocessing 'demo.saty' ...
  evaluating 'color.satyh' ...
  evaluating 'pervasives.satyh' ...
  evaluating 'geom.satyh' ...
  evaluating 'gr.satyh' ...
  evaluating 'tabular.satyh' ...
  evaluating 'annot.satyh' ...
  evaluating 'footnote-scheme.satyh' ...
  evaluating 'hdecoset.satyh' ...
  evaluating 'itemize.satyh' ...
  evaluating 'math.satyh' ...
  evaluating 'proof.satyh' ...
  evaluating 'vdecoset.satyh' ...
  evaluating 'code.satyh' ...
  evaluating 'stdjabook.satyh' ...
  evaluating 'local.satyh' ...
 ---- ---- ---- ----
  evaluating texts ...
  evaluation done.
 ---- ---- ---- ----
  breaking contents into pages ...
  [Warning] an overfull line occurs on page 1
  [Warning] an overfull line occurs on page 1
  needs another trial for solving cross references...
 ---- ---- ---- ----
  evaluating texts (2nd trial) ...
  evaluation done.
 ---- ---- ---- ----
  breaking contents into pages ...
  [Warning] an overfull line occurs on page 1
  [Warning] an overfull line occurs on page 1
  all cross references were solved.
 ---- ---- ---- ----
  embedding fonts ...
 ---- ---- ---- ----
  writing pages ...
 ---- ---- ---- ----
  output written on 'demo.pdf'.
```

これで成功です！！

# satyrographos を使ったインストール

ocaml のバージョンの推奨は 4.10.0 ですが私は 4.12.0 をインストールしています。

```
$ sudo apt update -y && sudo apt upgrade -y
$ sudo apt install opam

$ opam init
$ eval $(opam env)

$ ocaml --version
The OCaml toplevel, version 4.08.1

$ opam switch create 4.12.0
$ eval $(opam env)
$ ocaml --version
The OCaml toplevel, version 4.12.0

$ opam repository add --all-switches satysfi-external https://github.com/gfngfn/satysfi-external-repo.git
$ opam repository add --all-switches satyrographos-repo https://github.com/na4zagin3/satyrographos-repo.git

$ opam install satysfi satysfi-dist satyrographos
#=== ERROR while compiling conf-pkg-config.2 ==================================#
# context     2.0.5 | linux/x86_64 | ocaml-base-compiler.4.12.0 | https://opam.ocaml.org#f7364ccf
# path        ~/.opam/4.12.0/.opam-switch/build/conf-pkg-config.2
# command     ~/.opam/opam-init/hooks/sandbox.sh build pkg-config --help
# exit-code   1
# env-file    ~/.opam/log/conf-pkg-config-21478-1be4d1.env
# output-file ~/.opam/log/conf-pkg-config-21478-1be4d1.out
### output ###
# bwrap: execvp pkg-config: No such file or directory

The packages you requested declare the following system dependencies. Please make sure they are installed before
retrying:
    pkg-config
```

pkg-config が無いと怒られたしまいました。インストールをします。

```
$ sudo apt install pkg-config
$ opam install satysfi satysfi-dist satyrographos
$ eval $(opam env)

$ satyrographos install
```
# 最後に

思いの外、インストールは簡単でした。

gist を載せておきます。
SATySFi build and installation
https://gist.github.com/blank71/a2053eba2ac3904c79a723b79b6ef973

私が困っているという投稿をしたときに助けてくれた @puripuri2100 さん、ありがとうございました。
https://twitter.com/void_cis_cs/status/1385434662026113028

# 参考文献

公式 README.md : [gfngfn/SATySFi: A statically-typed, functional typesetting system](
https://github.com/gfngfn/SATySFi)

[SATySFi インストール手引き 2021年2月版](https://qiita.com/na4zagin3/items/a6e025c17ef991a4c923 )