mruby のコンパイルがうまくいかない

楽しかった TAS は終わりで mruby の構築をはじめます.
いままでは pacman -S mruby でとってこれるバイナリパッケージを使ってましたが、 require が使えないことが大変によろしくないのでコンパイルをすることにしました.

一連の流れ

git clone https://github.com/mruby/mruby
cd mruby
cp build_config/default.rb build_config/myconfig.rb
(編集後)
rake -v MRUBY_CONFIG=myconfig

build_config/myconfig.rb は必要に応じて機能を追加削除できます.

自分は rake を使ったことがなかったので勝手を覚えるのに手間取りました. というのもこのビルドシステムは結構な規模がある上、並列処理もあるのでしょうけど、エラーメッセージが流れて追いかけるのが大変でした.

MRUBY_CONFIG=default なら msys2 であってもエラーがでなくて助かりました.

iij/mruby-require と fts.h

default ならバイナリパッケージでいいのでここからです. build_config/myconfig.rb に追加します.

  conf.gem :github => "iij/mruby-require"

そうすると自動的にソースを取ってきてビルドとなりますが、エラーが流れてしまって当初は気づきませんでした.

fts.h がないというのは、私の msys2 の中では /usr/include にはあって、 /mingw64/include にはないということです. さらに rake が /usr/include と書いても認識しないらしく、Windows として本当の絶対パスの d:/dev/msys64/usr/include と書いて認識しました.

次の問題が d:/dev/msys64/usr/include の path を build_config/myconfig.rb に書いてはならず、 build/repos/host/mruby-tempfile/mrbgem.rake に書き足せばコンパイルが通ります.

たぶんこれは msys と mingw を混ぜてはいけない注意が示す実例のようで、 /usr/include と /mingw64/include には重複するファイルもあり、混乱を抑えるために mruby-tempfile だけにしたらコンパイルが通っただけだと思われます.

さらに下記の msys ライブラリ (cygwin でいう POSIX 互換レイヤーだと思う)を足すとリンクも通ります.

    spec.linker.library_paths += ["d:/dev/msys64/usr/lib"]
    spec.linker.libraries << 'msys-2.0'

そしてリンクが通ったところで実行ファイル (mirb) は動かないです. require を抜けば動きます. ここどうしていいかわからないです.

仮に動いても msys 互換レイヤ込でバイナリ配布はあまり気が乗らず. fts って何のためにあるのか、どうせならなくしたい、そんな気持ちです.

正規表現ライブラリ

正規表現もバイナリパッケージに入っていません...

  conf.gem :github => "mattn/mruby-onig-regexp" #うごいた
  #conf.gem :github => "mattn/mruby-pcre-regexp" #ダメ
  #conf.gem :github => "pbosetti/mruby-hs-regexp", :branch => "master" #ダメ
  #conf.gem :github => "masamitsu-murase/mruby-hs-regexp", :branch => "master" #ダメ

たくさんあるみたいですが今でも使えるのは mattn/mruby-onig-regexp だけみたいでした. ビルドが通らない、ビルドが通っても落ちる. .... 楽しくないです.

不安定な mirb

基本機能はこれだけにしてます.

  conf.gembox "stdlib"
  conf.gembox "stdlib-ext"
  conf.gem :core => "mruby-math"
  conf.gem :core => "mruby-rational"
  conf.gem :core => "mruby-io"
  conf.gem :core => "mruby-print"

これと mattn/mruby-onig-regexp で mirb をためしたところ画像の感じです.
f:id:na6ko:20210610214849p:plain

特に未使用変数書いただけで Segmentation fault は勘弁して欲しいです.