msys2 上で ocaml をビルドしようとして失敗した記録

■真新しいmsys2上でomakeを使いたくなったが、周知の通り現在はWindows用のバイナリが配布されていない。
msys2上のocamlでomakeをビルドしようとしたが上手く行かない。そこで、msys2上でocamlをビルドしてみればいいのではないかというアホなことを考えて失敗した記録。

■準備。本当に必要かどうかはわからない。

$ pacman -S gamin #fam みたいなもの
$ pacman -S bison #yacc みたいなもの
$ pacman -S gcc git patch

■ocamlをビルドする

#ocaml を msys2 上でビルドする。
$ git clone https://github.com/ocaml/ocaml
$ cd ocaml
$ ./configure -host x86_64-w64-windows -cc "gcc -Wno-error=implicit-function-declaration -Wno-error=int-conversion -Wl,--stack,16777216"
$ make clean
$ make world
$ make install

ln: シンボリックリンク 'ocamlyacc' の作成に失敗しました: No such file or directory
make: *** [Makefile:606: install] エラー 1

■msys2でsymlinkを使う方法:msys2_shell.cmd をテキストエディタで編集し

rem To activate windows native symlinks uncomment next line
rem set MSYS=winsymlinks:nativestrict

となっているところを

rem To activate windows native symlinks uncomment next line
set MSYS=winsymlinks:nativestrict

に変更して保存する。そして、msys2_shell.cmd を右クリックして「管理者として実行」してmsys2のシェルを立ち上げる。

■手持ちの別のマシンでやったところ ocamlyacc のエラーは出なかったが omake のビルドで

$ ocaml configure.ml
Cannot load required shared library dllcamlstr.
Reason: dllcamlstr.so: dynamic loading not supported on this platform.
Cannot load required shared library dllunix.
Reason: dllunix.so: dynamic loading not supported on this platform.
File "./configure.ml", line 1:
Error: Reference to undefined global `Str'

となって止まってしまった。

広告

(自分用メモ)omake -P が停止するトラブル(fam)とその解決

■短気な人のためのまとめ■
omake -P が「om_notify_open」とか言い出してコケたら fam が止まってることを疑って、 $sudo service fam start しておけ

■症状■

omake -P& してたら

*** omake error:
Failure: om_notify_open: (null)

[2]+ 終了 123 omake -P

というメッセージが出て、omake が止まってしまった。 omake -P をもう一度走らせてみても、同じメッセージを吐いて omake が終了してしまう。 P オプションを付けずに omake を動かすぶんには何も支障はなかった。

■原因■
om_notify_open でググると、どうやら fam が止まってしまったらしい。

■そもそも fam is what■
fam とは file alternation monitor で、ファイルをリアルタイムで監視してくれているデーモン。 omake が P オプションで動作するときのリアルタイムファイル監視は、このデーモンが提供している。

■対策■
fam が止まってるらしいので、fam を再起動すればよい。

$ sudo service fam start

無事に omake -P も動くようになった。

■そもそもなぜ fam が止まったのか(未解決)■
omake が死ぬ直前に、omake -P が監視しているディレクトリで2000個近くのファイルを一度に rm した。関係あるかもしれないし、ないかもしれない。

■そもそも本当に fam が止まっていたのか■
$ ps -x | grep "fam"
してもっとちゃんと確認すればよかったと思いました(小学生並みの感想)。

■やらないほうがいいかもしれないこと■
サービスの名前から locate して init.d あたりにあるやつを指定して $ sudo hogehoge start みたいなことをすると良くないかもしれないそうです。

■ fam が入ってない人はどうすればいいの■
$ sudo apt-get install fam

OMakeを使った(簡易)継続的インテグレーション

※自分用のメモです。色々説明していません。Windows+MSYSが前提。
参考にした記事:たぶんプログラミングとかについて書いていくブログ/OMakeの使い方復習

■目標:foo.py を保存する毎に、自動的に pylint にかけたい。(矢印キーすら打ちたくない)。

■主要なツール:OMake

■例示のための前提となるディレクトリ構成
dev ┐
├ foo.py
└ bar.py

■OMake 関係のファイルを作る

$ pwd
dev
$ ls
bar.py   foo.py
$ omake --install
*** omake: creating OMakeroot
*** omake: creating OMakefile
*** omake: project files OMakefile and OMakeroot have been installed
*** omake: you should edit these files before continuing
$ ls
OMakefile   OMakeroot   bar.py   foo.py

■OMakefileを編集する
以下の行を適当なところに書き加える:

PYLINT = pylint.exe
PATH += C:\Python278-32bit\Scripts\

foo_pylint : foo.py
    $(PYLINT) -E foo.py

■(ゴール):OMakeで foo.py に対して継続的に pylint をかける

$ pwd
dev
$ omake -P foo_pylint

これで、foo.py をエディタ上で保存するたびに pylint -E がかかるようになります。

■追記: Ctrl+C で中断できる(あたりまえ)。