2021年9月20日月曜日

[OCaml]merlinが参照するcmiファイルの自動更新

OCamlの開発環境として Emacs + Merlin + Tuareg を使用しているが、自ファイル以外のモジュールを参照するためには、cmiファイルを生成しなければならなかった。

dune を使用していれば、プロジェクトディレクトリ配下で

$ dune build @check

を実行すれば生成されるのだけど、ファイルの更新でいちいちこれを実行するのは面倒なのでスクリプトを作成した。

Linuxはファイル更新の検知に inotifywaitコマンドがあるのでそれを利用した。
inotifywaitコマンドはinotify-toolsパッケージにあるのでインストールしておく。

$ sudo apt install inotify-tools

スクリプトはこちら。

dune_build_check.sh

#!/usr/bin/env bash

# for test
#set -euo pipefail

USAGE(){
    echo "usage: dune_build_check.sh <dir>"
    exit 1
}

[ "$#" -eq 0 ] && USAGE >&2

cd "$1"

while : ; do
    result=$(find -type f -name '*.ml' -o -name '*.mli' | xargs inotifywait -q -e modify)
    if [ $? -eq 0 ]; then
        echo "$result"
        dune build @check
    fi
done

duneコマンド実行後に、再度、監視対象とするmlファイル、mliファイルを取り直しているので、新規ファイル追加時は既存ファイルを一度編集すればよい。

自動でやってくれるようなオプションがduneにありそうに思ったが無さそうだった。

参考

0 件のコメント:

コメントを投稿