Termux , OCaml 

https://qiita-com.translate.goog/dauuricus/items/320d0ba143d56dbaa0f0?_x_tr_sl=ja&_x_tr_tl=en&_x_tr_hl=ja

`https://bit.ly/3egJ6cQ`

ずっと Ocaml を termux にインストールしようとして、たぶん　一ヶ月以上　なんのことかわからない目にあっていて、（ Ocaml 自体を）コンパイルできないでいた。
それは結局できてないが、できるという情報と、できないという情報が混在していて悩ましい。

* コンパイルしてインストールできてない。

* Termux のパッケージとして Ocaml, opam をインストールした。

というストーリーです。

今現在 Termux の公式パッケージには存在しない。という前提です。

https://github.com/termux/termux-packages/tree/master/packages

前半は、32 bit OS android 

````
~ $ uname -a
Linux localhost 4.4.146+ #1 SMP PREEMPT Thu Nov `25 16:54:56 UTC 2021 armv8l Android
~ $ getprop ro.product.cpu.abilist
armeabi-v7a,armeabi
```

でのテスト。
64 bit architecture の cpu でも OS が 32 bit だったりする。

この記事は基本的に未完。

なので、後方にいくほど最新の結果となるので、**結論に近いところ** になる。

そしてこの性質上、結論に近いところは常に後方へ移動していく。

---

## まず、できないやり方。

https://wiki.termux.com/wiki/Compiling_and_setting_up_OCaml

ここに書かれている方法は、

https://ygrek.org/p/ocaml-termux.html

ここからのコピー。

なので後者をやってみて、レポジトリからコンパイル済みのパッケージをインストールという方法から、結論を書くと、レポジトリが　NG 。
![Screenshot_20211220-211730.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/75f4ddbc-cfc3-c9c6-83a2-18025ab7295b.png)

あと、インストラクションに書かれている、これは、

```
"$PREFIX/usr/etc/apt/sources.list"
```

こっちが正解だった。

```
"$PREFIX/etc/apt/sources.list"
```

PATH が違う。コンパイルの方は、

![IMG_20211215_210905_485.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/cd6bd396-cd09-6bc2-8aa6-2f8668b1554f.jpeg)

`./configure` するとこうなったが、make するとエラーでできない。（でも、make できてるから残ってるんだと考えられるので、場合によって make できなくて困るということ。）


でもここを読んでから、Ocaml のインストール方法を調べると、opam がパッケージマネージャーであること、パッケージマネージャーから Ocaml をインストールということらしい。

https://ocaml.org/learn/tutorials/up_and_running.html

Ocaml 自体をコンパイルするビルド方法としては、こちら。

https://github.com/ocaml/ocaml/blob/trunk/INSTALL.adoc

しかし、Termux でビルドする基本を全く知らないので、スタンダードな情報としてももう少し掘り下げて、さらに Termux でのビルドを試行錯誤するのはもっと時間がかかる。やった方がいいけど、今はつらい。

----

## インストールできた方法。ただし、ocaml 自体はコンパイルできない。

本来は、opam で ocaml のソースをとってきて、自動でビルドするという、他の言語でもよくある方法でインストールするらしいが、{**Temux ではいろいろややこしい。らしい**というイメージのために、質問してもかなり侮蔑的に扱われたりする。} のがちょっとめんどくさい。

そして、実際よくわからない。
でも、どこそこには、[そのプログラムならコンパイルしたのがあるよ、という情報](https://github.com/termux/termux-packages/pull/1343)はちらほら見かける。

そこでレポジトリのこと書いてるものをよく読むと、

https://wiki.termux.com/wiki/Package_Management

### By its-pointless
>Repository of this community member includes gcc, gfortran, octave, r-cran (R language), scipy and lots of games!

>To add this repository, execute:

>```terminal:excute
curl -LO https://its-pointless.github.io/setup-pointless-repo.sh
bash setup-pointless-repo.sh
```

>The script essentially installs gnupg on your device, downloads and adds a public key to your apt keychain ensuring that all subsequent downloads are from the same source.

ああ、これだ。[its-pointless](https://github.com/its-pointless/gcc_termux) が、そのパッケージならあるよ、と issues に書き残しているのはよく見かけていたが、どこにそれがあるのか、どうやってアクセスするのか知らなかったが、ここに書いてあってようやく、点と点がつながった。

つまりコミュニティーレポジトリの登録をすると apt search で its-pointless のパッケージをリストアップしてくれるということだったのだ。

一応注意しておくと、Termux デフォルトの APT には公式パッケージにも非公式パッケージにも存在しない。 

![IMG_20211220_212122_768.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/720d8c8a-6543-19df-6dfe-582bb2f6a5b5.jpeg)

パッケージになってる opam は its-pointless のレポジトリにあった。

opam から ocaml をビルドしようとしたがエラーだった。

![Screenshot_20211220-213047.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/2c9fe259-0bb2-1a6e-a7da-f9029c84a094.png)

ビルドは失敗。

ビルドはとりあえず諦めて、リポジトリからパッケージでインストールすることはできた。

![IMG_20211220_220010_247.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/f730426a-20aa-78d6-46a9-05f1081418a4.jpeg)

というところまで。

https://www.opam.jp/sp/?url=sp

参考:
https://kuis-isle3sw.github.io/IoPLMaterials/textbook/setting-up-ocaml.html

https://qiita.com/zenwerk/items/7bc6177adcbeb6990e60

こっちが新しい情報

https://dev.realworldocaml.org/install.html

Ocaml については、

https://baturin.org/blog/introduction-to-ocaml/

![IMG_20211221_222842_035.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/fac90f48-6706-5f1d-8217-329b8abc3c5d.jpeg)

ただ [fish](https://fishshell.com/) が変になっている。
そして、opam から ocaml をインストールできないということは、他のパッケージも対応できないかも。

---

##　ビルドの調査

Termux でビルドできたらいいんだけど、そもそもビルドして使えるようにする手順自体を知らないことには、なんともできない。

いったん Termux を離れて、借りてきていて全然使っていない arm の cpu の chromebook を起動して、コンテナの linux を一旦全部破棄して、ゼロからやってみた。

![IMG_20211224_184306_276.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/b0abd0e3-668d-fda7-7fc2-dc1b85951639.jpeg)


さうすると、今度はソースコードからビルドする方法について、よくわからないのでその情報から探す。
結論から云うと見つからないので、Termux でのビルド方法を参考にした。

つまり、これ。
https://ygrek.org/p/ocaml-termux.html

opam については、github には省略されているが書いてある。でもこれではわからないので、キーワードを拾って検索して調べる。でも合っているのかは、やってみないとわかりようがないのでトライアンドエラーで。
https://github.com/ocaml/opam

[debian の APT パッケージでインストールできたのは ocaml 4.05.0](https://ocaml.org/docs/install.html#From-Source) で、それは同じく APT パッケージの opam からはバージョンアップ不能だったのだけれども、どうなんだろう？と

```
sudo apt-get install git build-essential diffutils m4 patch vim
```

```
git clone https:://github.com/ocaml/ocaml
```

```
cd ocaml
```

```
./configure --help

./configure
```

すごく長いことかかって、

```
make
```

```
make install
```

インストールはされた（ 5.00.0+dev0-2021-11-05 というバージョン。）。そして、次は opam をソースコードからビルドしようとしたが、エラーがたくさん出て失敗。パッケージがあれこれないよという警告が出ていたが、それは ocaml 関連のパッケージのように見えた。
ここで謎だが、opam をビルドするには ocaml が、まずないといけない・・・ということが書かれているのをいくつか見ていたから（担保する情報は無し）、この順でビルドしたらいいのかなと考えたわけだが、とりあえずは失敗。理由は今は知らない。

## APT パッケージの opam を使った方法

APT パッケージとは、

```
apt update
apt upgrade
```

```
apt-get install 
```

```
apt autoremove
```

とかで使っている、リポジトリからインストールしたバイナリのプログラムのこと。この場合のバイナリというのは、既にコンパイルされた状態のもので、それをダウンロードしてきて、しかるべき場所にコピーするのに、`apt-get install`が使われている、と思っている。

では、**opam を APT からバイナリでインストールして**、既にソースコードからビルドされた ocaml 5.00.0+dev0-2021-11-05 というバージョンのコンパイラーと debian のパッケージの opam （パッケージマネージャー）の組み合わせで、ビルドした ocaml 5.00.0+dev0-2021-11-05 を認識する (`opam switch list`でなにかコンパイラが表示される) のかを試してみた。

```
sudo apt-get install opam
```

```
opam init
```

すると、ビルドした ocaml （ 5.00.0+dev0-2021-11-05 というバージョン ）についてはスルーして、 4.13.1 バージョンがインストールされた。

![Screenshot 2021-12-23 16.15.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/4327b7de-587a-03bb-bfdd-94ff6efcc180.png)

どういうことかは釈然としない。

パターンとして、

* ① 前もって ocaml をソースコードからビルドしないで、APT からインストールした opam だけの場合でも同じになるのか（**なりそう**）、
* ② もしくは opam 、ocaml 両方 APT からインストールして opam で ocaml をバージョンアップさせることが（この前に試行してできなかったが）できるのか、

ということと比較しないと判断つかない。
だけども、とても時間がかかる。

というところ。

##結論に近いところ

① から確かめるために、chromebook の linux 環境を削除してから、もう一度 linux を設定するところから。
![Screenshot 2021-12-24 18.29.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/0fb8fd0f-cf3a-3b43-5287-3a5d0f2545ed.png)

```
apt update

sudo apt-get install git build-essential diffutils m4 patch vim
```

```
apt-get install opam
```

APT からパッケージでインストールした opam で `opam switch list` コマンドを与えると、先に `opam init` してくださいと表示されるので、

```
opam init
``` 

![Screenshot 2021-12-24 18.47.06.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/94ce66b7-ca85-1771-da59-ce549f2fafb7.png)

バージョンが・・・ ocaml 4.11.1 
ふうーん？

```
eval $(opam env)

opam switch list-available
```

これで確認するらしい。なにを？opam パッケージを。

すると、`ocaml-base-compiler 4.13.1` があるようなので

```
opam switch create ocaml-base-compiler.4.13.1
```

![Screenshot 2021-12-24 19.01.11.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/8acffe30-d27c-14f1-07e5-69cbeb7c568f.png)

ocaml-base-compiler.4.13.1　インストールできた。
ということは、そういうこと。

① 前もって ocaml をソースコードからビルドしないで、APT からインストールした opam だけの場合でも`opam init`,`opam switch create ocaml-base-compiler.4.13.1`で、ocaml のコンパイラーがインストールできる。

通常は、opam パッケージマネージャーが使えたら、ocaml は、opam からビルドするわけだ。
まぁ、そう書いてあるが。

Termux では、それができない。ただし、arm の場合で、os が 32 ビットの場合は、という条件下では。

とりあえず、通常の手順は理解した上で。

まだもやっとするのは、Termux でどうやったらビルドできるのか。

https://wiki.termux.com/wiki/Differences_from_Linux

---

ではまず、chomebook に termux アプリを入れて、こちらはガチの 64 ビット OS だと思うので、
前述の termux community repo :  `its-pointless` をセットして、

```
pkg install opam
```

何をするかというと ① のやり方で、arm cpu 64bit OS chromebook のケースを調べる。 

```
opam init
```

これでは、ocaml はインストールされなかったので、

![Screenshot 2021-12-24 23.49.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/1ea1105f-919b-6ff0-8f84-902992534f30.png)


bildessential や、clang を入れて、さらに git 、 rsync も入れて、

```
pkg install git build-essential clang rsync git
```

```
opam switch create 4.13.1
```

としてみると、

![Screenshot 2021-12-25 00.21.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/b36036fc-e4ca-70ce-236e-390f4f5c0268.png)

インストールできた。
これは、opam インスストールだけでは ocaml はインストールされず、`opam init` してもダメで、`opam switch create 4.~` で 指定されたバージョンのコンパイラーがビルドされるということ。
**② もしくは opam 、ocaml 両方 APT からインストールして opam で ocaml をバージョンアップさせることが（この前に試行してできなかったが）できるのか、** に対する回答は、opam をインストールして、`opam init` して、`opam switch create 4.~` で 指定されたバージョンのコンパイラーを自動でビルドする。今回は、`opam init` した後に、`opam switch create 4.13.1` で ocaml-base-compiler.4.13.1 コンパイラーがビルドされた。

ということは、arm 64bit cpu で 32 bit OS の場合は、エラーになるという問題、ということかな。

---

["できないやり方"](https://qiita.com/dauuricus/items/320d0ba143d56dbaa0f0#%E3%81%BE%E3%81%9A%E3%81%A7%E3%81%8D%E3%81%AA%E3%81%84%E3%82%84%E3%82%8A%E6%96%B9) で紹介したやり方を github の termux package のなかの issues を調べてたどって、掘り下げていく。
 
https://github.com/ocaml-cross/opam-cross-android

to be continued 

---

## UserLAnd 

[UserLAnd](https://en.m.wikipedia.org/wiki/UserLAnd_Technologies) というアプリをインストールして arm 64 bit cpu, 32 bit OS のアンドロイドで

### debian
debian をセットする。セットアップできたら ssh で接続。

```
sudo apt update
sudo apt-get upgrade
sudo apt-get install apt-utils
sudo apt-get install opam
```

![IMG_20211225_172006_948.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/a50ced18-e643-f5dd-bc03-56777b28691e.jpeg)

```
opam init
```

![Screenshot_20211225-172717.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ff8c9480-56ce-a6ac-bef5-c2af17113298.png)

エラーになっているんだけど ...

```
eval $(opam env)
```

```
opam switch list
```

![Screenshot_20211225-174531.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/c3ef1a75-b519-433e-4f0b-f0b4b3410165.png)

4.13.1 という名前になってしまったが、実際は ocaml-nox/oldstable,now 4.05.0-11 armhf [installed,automatic]だ。

debian,Arch,ubuntu でのそれぞれのパッケージ（ apt,pacman,apt ）を実際にインストールしてみたところ、どれも opam からのビルドはエラーになってできない。ocaml のパッケージは ubuntu が The OCaml toplevel, version 4.08.1 で他よりは新しい。 Termux だとパッケージでは 4.09 だったと思う。

他にも参考までにパッケージを確認して見たところ、結構古いバージョンだなという印象。Gauche,Racket,Nim,Ruby,Julia を確認したけど、それぞれ古くて使えないかもしれない。Termux だと新しいバージョンだったりするので、その辺りが違いか。

### Alpine
しかし、これはないだろうなと思っていた、Alpine （軽量 Linux ）をセットして apk （パッケージマネージャー）から、opam をインストールし、gcc,m4,rsync,mercurial,git をインストールして、同じように opam からocaml をインストール（ビルド）するのに失敗し、apk から ocaml パッケージをインストールすると、一番新しいバージョンがインストールされた。

![IMG_20211225_225201_823.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/ea9d433c-5544-6fb6-70f3-e2e489efafbc.jpeg)

しかし、opam からパッケージをインストールできない。

![IMG_20211225_233322_282.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/0ea734a8-16f6-4805-0b6f-90fd82537352.jpeg)

🐫 [Why does opam require bwrap?](https://opam.ocaml.org/doc/FAQ.html#Why-does-opam-require-bwrap)

https://linuc.org/study/knowledge/526/


ここで直接関係しないけど、以前 Termux を使って Lua で https リクエストのプログラムを書こうとして、Lua の https が使えるライブラリーを探して、Luarocks でライブラリーをインストールしようとしたところ、ことごとく依存関係のライブラリーのインストールに失敗した。Termux では、Termux 以外のパッケージマネージャーで提供されているモジュールライブラリーに関してはパッケージとして提供しということで、Termux の問題ではないということになり、luarocks で質問しても、それは Termux 環境だし知らんよね（よくそうなる。OCaml のマトリクスでも、「やめとけ」と言われた。）ということになった。linux 環境では、パッケージに問題あっても、Luarocks と別の OS のパッケージマネージャーで使えるバイナリがあったりするのでなんとか、どうにかなるのかもしれないが、Termux では[どうにもならないで困った](https://github.com/termux/termux-packages/issues/7469#issuecomment-913945867)ということがあった。結局便利そうな https クライアントのライブラリーは全部使えないと割りきって、[lua-curl](https://qiita.com/dauuricus/items/a7c756569a3d7bcf46f2#lua) だけが依存関係がクリアしているので、Termux の luarocks でインストールして使った。

ということがあって、印象に残っている問題のライブラリーを UserLAnd の Alpine でサーチ。

```
localhost:~$ apk search lua-cjson
lua-cjson-2.1.0-r10
localhost:~$ apk search cqueues
lua-cqueues-20200726-r3
lua5.1-cqueues-20200726-r3
lua5.3-cqueues-pushy-0.20180530-r1
lua-cqueues-pushy-0.20180530-r1
lua5.4-cqueues-20200726-r3
lua5.3-cqueues-20200726-r3
lua5.2-cqueues-20200726-r3
lua5.2-cqueues-pushy-0.20180530-r1
```

UserLAnd でのストレージへのアクセス方法。つまり、UserLAnd の中の OS 環境でなんかファイル作った場合、Android のファイラから見えない。[Termux だと、おまじないみたいなこと](https://wiki.termux.com/wiki/Termux-setup-storage)したらファイラからもアクセス可能で便利だけど、UserLAnd の場合は、`/storage/imternal/` の下にファイルをコピーするとファイラからアクセスできるようになる。

https://github.com/CypherpunkArmory/UserLAnd/wiki/Importing-and-exporting-files-in-UserLAnd

初めて UserLAnd 使ってみて気がついたんだけども、以前に [Termux の Python で Pygame を使ってインベーダーゲームを表示させるのに、長い道のりで到達した](https://qiita.com/dauuricus/items/8b3c079b0cea067909d0)ことがあるんだけど、UserLAnd だと最初から SDL の設定とか説明されているので簡単にできるのかもしれない。pygame2 があれば。

UserLAnd では、ssh 接続、VNC 接続が選べて、ssh 接続で別のクライアントも選べる。
なんか使い方の説明の一番最初の導入口がバッサリ省略されていて、わからなかったが、このクライアントを使ってみる。

https://green-green-avk.github.io/AnotherTerm-docs/#main_content

![IMG_20211227_104329_966.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/225786/e30723ca-cd9f-0d37-7e2f-82f4b58a31ad.jpeg)


Termux, UserLAnd ともに、どうやって適合するパッケージを作っているのかが、まだ全然わからないので、それができないと自力ではどうしようもできないということがある。わかれば楽しいけれども、そうじゃないと恐々とパッケージをリクエストして、見守ることしかできない。

https://github.com/proot-me/proot/blob/master/doc/proot/manual.rst#proot

https://github.com/Hax4us/TermuxAlpine