IntelliJとWSLでOCaml


前提

  • OCamlのことはあんまりよく分かってません
  • JetBrainsによる公式サポートではない部分を含みます

登場人物

  • IntelliJ IDEA Ultimate
    • Community Editionでも大丈夫そう
  • reasonml-idea-plugin
    • Reason MLのプラグインがOCamlもサポートしてるようです
  • Ubuntu on WSL(とbash)
  • OCamlのツール各種

概要

Windows側にある
 IntelliJとプラグインが
Windows側にある
 プロジェクトに対して
WSL側にある
 bashとOCamlのツール各種を使って色々やります12

WSLのbashをIntelliJのターミナルとして開く設定

File | Settings | Tools | Terminal
Shell Path に C:\Windows\System32\wsl.exe を設定します。
プロジェクト単位で設定しておけるので大変便利です

中略

WSLのbashからWindowsのファイルは基本的には問題無く使えます。
(どういうエッジケースがあるかなどは把握していませんが、
 改行コードおよびgitで悲しい感じになる場合があります)

以下、コマンド実行はすべてWSLのbashで行います。

OPAM

OCamlのパッケージマネージャであるOPAMを
WSLのUbuntuにインストールします
https://opam.ocaml.org/doc/Install.html#Ubuntu

add-apt-repository ppa:avsm/ppa
apt update
apt install opam

OCamlコンパイラ

OPAMでOCamlコンパイラをインストールします
https://ocaml.org/docs/install.html#OPAM

# environment setup
opam init
eval `opam env`
# install given version of the compiler
opam switch create 4.10.0
eval `opam env`
# check you got what you want
which ocaml
ocaml -version

エラー

opam switch create 4.10.0

あたりでエラーに気づきます。

### output ###
# bwrap: Creating new namespace failed, likely because the kernel does not support user namespaces.  bwrap must be installed setuid on such systems.

bwrap & sandbox

https://github.com/ocaml/opam/issues/3747#issuecomment-462339452
https://github.com/ocaml/opam-repository/issues/12050#issuecomment-393478072

  • サンドボックス機能のためにbwrapというものが必要で、WSLではそれがサポートされていないようなので、サンドボックスを無効化します。
    • 一度も初期化してない状態であれば、opam init --disable-sandboxingでできそうですが、未確認
  • 一度以上(?)初期化済みであれば~/.opam/configにあるwrap-*-commandな設定を削除します

    wrap-build-commands:
    [ [ <term> { <filter> } ... ] { <filter> } ... ]
    wrap-install-commands:
    [ [ <term> { <filter> } ... ] { <filter> } ... ]
    wrap-remove-commands:
    [ [ <term> { <filter> } ... ] { <filter> } ... ]
    

その後、opam initからやり直します。

SDKの設定

  • プラグイン公式の通りSDKを設定しますが、WSL側にあるディレクトリを選びます。
    • \\wsl$\Ubuntu\home\ユーザ\.opam\4.10.0のような感じ
  • OCamlのソースはWSL側にgit cloneしましたが、どっちでも良さそう?

補完が効いて嬉しい!

ただし、私はOCamlのことをあんまり分かってないので、何ができてどれだけ嬉しいかよく分かってません。

ocamlbuildでHello World

ついに、Hello Worldです
https://ocaml.org/learn/tutorials/basics.html

To compile an OCaml program named my_prog.ml to a native executable, use ocamlbuild my_prog.native:

ネイティブのバイナリを出力するためにはocamlbuildというのが必要なようですが、まだ入っていません。
opam search ocamlbuildで探すとやっぱり存在してたので
opam install ocamlbuildします。

あとは上記のチュートリアル通りにビルドして実行してください。


  1. (JetBrainsのC/C++向けIDEである)CLionでのCMakeサポートがだいたいこのような構成になっていて、さらにもう少しIDEとの連携ができます。 

  2. VSCodeにはWSL側のファイルを開く機能が存在しており、Ubuntu上でVSCodeを開いている状態に限りなく近い状況で操作できます。構成がシンプルになって混乱も少ないので、IntelliJに愛が無ければVSCodeを使ったほうが良いと思います。