Skip to content

Instantly share code, notes, and snippets.

@udzura
Last active September 4, 2020 10:13
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save udzura/51b2374cd10ddc0294226ff67c85223c to your computer and use it in GitHub Desktop.
Save udzura/51b2374cd10ddc0294226ff67c85223c to your computer and use it in GitHub Desktop.

mruby3 を試す


  • ビルド設定の構成変更について検証。
  • まずはビルド。
git clone https://github.com/mruby/mruby.git
cd mruby/
git checkout mruby3
rake
rake test

なんかビルドとかテスト高速になってない?気のせいかなw

$ ls -la
total 368
drwxrwxr-x 18 vagrant vagrant   4096 Sep  4 06:45 .
drwxr-xr-x  9 vagrant vagrant   4096 Sep  4 06:45 ..
drwxrwxr-x  8 vagrant vagrant   4096 Sep  4 06:44 .git
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:31 .github
-rw-rw-r--  1 vagrant vagrant    305 Sep  4 06:31 .gitignore
-rw-rw-r--  1 vagrant vagrant 118829 Sep  4 06:31 .gitlab-ci.yml
-rw-rw-r--  1 vagrant vagrant    280 Sep  4 06:44 .travis.yml
-rw-rw-r--  1 vagrant vagrant    235 Sep  4 06:31 .yardopts
-rw-rw-r--  1 vagrant vagrant   1078 Sep  4 06:31 AUTHORS
-rw-rw-r--  1 vagrant vagrant   2777 Sep  4 06:44 CONTRIBUTING.md
-rw-rw-r--  1 vagrant vagrant 104234 Sep  4 06:31 Doxyfile
-rw-rw-r--  1 vagrant vagrant    179 Sep  4 06:31 LEGAL
-rw-rw-r--  1 vagrant vagrant   1061 Sep  4 06:31 LICENSE
-rw-rw-r--  1 vagrant vagrant    188 Sep  4 06:31 Makefile
-rw-rw-r--  1 vagrant vagrant    343 Sep  4 06:31 NEWS
-rw-rw-r--  1 vagrant vagrant   4478 Sep  4 06:44 README.md
-rw-rw-r--  1 vagrant vagrant   9157 Sep  4 06:44 Rakefile
-rw-rw-r--  1 vagrant vagrant    185 Sep  4 06:31 TODO
-rw-rw-r--  1 vagrant vagrant   1693 Sep  4 06:44 appveyor.yml
drwxrwxr-x  2 vagrant vagrant   4096 Sep  4 06:44 benchmark
drwxrwxr-x  2 vagrant vagrant   4096 Sep  4 06:44 bin
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 build
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 doc
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 examples
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 include
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:31 lib
-rwxrwxr-x  1 vagrant vagrant     40 Sep  4 06:31 minirake
drwxrwxr-x 48 vagrant vagrant   4096 Sep  4 06:44 mrbgems
drwxrwxr-x  2 vagrant vagrant   4096 Sep  4 06:44 mrblib
-rw-rw-r--  1 vagrant vagrant    611 Sep  4 06:31 mruby-source.gemspec
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:31 oss-fuzz
drwxrwxr-x  2 vagrant vagrant   4096 Sep  4 06:44 src
drwxrwxr-x  2 vagrant vagrant   4096 Sep  4 06:44 target
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 tasks
drwxrwxr-x  3 vagrant vagrant   4096 Sep  4 06:44 test

build_config がない??????????????? そういうもんだっけ?

デフォルトで target/host.rb を使うようになっている

$ cat target/host.rb 
MRuby::Build.new do |conf|
  # load specific toolchain settings

  # Gets set by the VS command prompts.
  if ENV['VisualStudioVersion'] || ENV['VSINSTALLDIR']
    toolchain :visualcpp
  else
    toolchain :gcc
  end
...
  • TARGET で指定したターゲットだけをビルドする。今までのようにたくさんのターゲットをビルドして時間がかかる現象がなくなるのでいい話だと思う。デフォルトは TARGET=host
  • ここで変更した
  • ちなみに MRUBY_CONFIG= 環境変数はまだ認識する
$ MRUBY_CONFIG=`pwd`/my_build_config.rb rake
GIT   https://github.com/mruby/mgem-list.git -> build/repos/host/mgem-list
Cloning into '/home/vagrant/mruby/build/repos/host/mgem-list'...
remote: Enumerating objects: 313, done.
remote: Counting objects: 100% (313/313), done.
remote: Compressing objects: 100% (311/311), done.
remote: Total 313 (delta 13), reused 22 (delta 1), pack-reused 0
Receiving objects: 100% (313/313), 55.18 KiB | 312.00 KiB/s, done.
Resolving deltas: 100% (13/13), done.
GIT   https://github.com/iij/mruby-regexp-pcre.git -> build/repos/host/mruby-regexp-pcre
  • build_config のDSL自体は大きな変更はない。
  • 既存のmgemも今のところそのまま動くように見える。
  • MRUBY_CONFIGを指定したらlockfileは以下に出現するらしい
$ ls build/
host  host.lock  my_build_config.lock  presym  presym.inc  repos
$ cat build/my_build_config.lock 
---
mruby:
  version: 2.1.2
  release_no: 20102
  git_commit: 6b2cd76874e260824dcb6304b49c04c23080cb15
builds:
  host:
    https://github.com/iij/mruby-regexp-pcre.git:
      url: https://github.com/iij/mruby-regexp-pcre.git
      branch: master
      commit: a961225c0953dd2bd987111f0836821573616de2
      version: 0.0.0
  • 2.1.2 のままなのはまだヘッダが更新されてないからです。
/*                                                                                                                                             
 * Major release version number.                                                                                                               
 */
#define MRUBY_RELEASE_MAJOR 2

/*                                                                                                                                             
 * Minor release version number.                                                                                                               
 */
#define MRUBY_RELEASE_MINOR 1

/*                                                                                                                                             
 * Tiny release version number.                                                                                                                
 */
#define MRUBY_RELEASE_TEENY 2
...

  • mod_mruby がビルドできるか試す
git clone https://github.com/matsumotory/mod_mruby.git
cd mod_mruby
rm -rf mruby
git clone https://github.com/mruby/mruby.git
( cd mruby; git checkout mruby3; rm -rf .git )

```console
$ sh build.sh 
NUM_THREADS=2
apxs= apachectl=
mruby building ...
mv: cannot stat 'build_config.rb': No such file or directory

そうですね...

diff --git a/build.sh b/build.sh
index c60ac1a..cdc0813 100644
--- a/build.sh
+++ b/build.sh
@@ -46,12 +46,12 @@ if [ -d "./build" ]; then
     echo "mruby Cleaning ... Done"
 fi
 echo "mruby building ..."
-mv build_config.rb build_config.rb.orig
-cp ../build_config.rb .
+# mv build_config.rb build_config.rb.orig
+cp ../build_config.rb target/mod_mruby.rb
 #rake BUILD_BIT='64'
 #rake BUILD_TYPE='debug'
 #rake
-BUILD_TYPE='debug' ./minirake
+TARGET='mod_mruby' BUILD_TYPE='debug' ./minirake
 echo "mruby building ... Done"
 cd ..
 echo "mod_mruby building ..."
diff --git a/build_config.rb b/build_config.rb
index 479fccf..372a20d 100644
--- a/build_config.rb
+++ b/build_config.rb
@@ -20,8 +20,8 @@ MRuby::Build.new do |conf|
   conf.gem :github => 'matsumoto-r/mruby-mutex'
 
   # mod_mruby extended class
-  conf.gem '../mrbgems/mod_mruby_mrblib'
-  conf.gem '../mrbgems/rack-based-api'
+  conf.gem '../../mrbgems/mod_mruby_mrblib'
+  conf.gem '../../mrbgems/rack-based-api'
 
   # use memcached
   # conf.gem :github => 'matsumoto-r/mruby-memcached'

ビルドはこれで「開始するように」なった。

一方でC APIの変更がある。

/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c: In function ‘mrb_env_aset’:
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:204:49: warning: passing argument 4 of ‘mrb_convert_type’ makes integer from pointer without a cast [-Wint-conversion]
     mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");
                                                 ^~~~~~~~
In file included from /home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:6:0:
/home/vagrant/mod_mruby/mruby/include/mruby.h:1253:19: note: expected ‘mrb_sym {aka unsigned int}’ but argument is of type ‘const char *’
 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);
                   ^~~~~~~~~~~~~~~~
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:204:5: error: too many arguments to function ‘mrb_convert_type’
     mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");
     ^~~~~~~~~~~~~~~~
In file included from /home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:6:0:
/home/vagrant/mod_mruby/mruby/include/mruby.h:1253:19: note: declared here
 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);
                   ^~~~~~~~~~~~~~~~
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c: In function ‘mrb_env_aset’:
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:204:49: warning: passing argument 4 of ‘mrb_convert_type’ makes integer from pointer without a cast [-Wint-conversion]
     mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");
                                                 ^~~~~~~~
In file included from /home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:6:0:
/home/vagrant/mod_mruby/mruby/include/mruby.h:1253:19: note: expected ‘mrb_sym {aka unsigned int}’ but argument is of type ‘const char *’
 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);
                   ^~~~~~~~~~~~~~~~
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:204:5: error: too many arguments to function ‘mrb_convert_type’
     mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");
     ^~~~~~~~~~~~~~~~
In file included from /home/vagrant/mod_mruby/mruby/build/repos/host/mruby-env/src/env.c:6:0:
/home/vagrant/mod_mruby/mruby/include/mruby.h:1253:19: note: declared here
 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);
                   ^~~~~~~~~~~~~~~~
rake aborted!
Command failed with status (1): [gcc -std=gnu99 -g -O3 -Wall -Wundef -Wdecl...]
/home/vagrant/mod_mruby/mruby/lib/mruby/build/command.rb:39:in `_run'

mruby-env の問題か............ うーんこれはわりと困るやつでは。

もとの宣言

    mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");

新しいプロトタイプ

MRB_API mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);

型が enum mrb_vtype type でないオブジェクトを渡したら mrb_sym method をオブジェクトに対して呼ぶんだと思うので、

を参考にパッチ

$ git diff HEAD~..HEAD
diff --git a/src/env.c b/src/env.c
index 0395e1b..030bcc3 100644
--- a/src/env.c
+++ b/src/env.c
@@ -201,7 +201,7 @@ mrb_env_aset(mrb_state *mrb, mrb_value self)
       mrb_raise(mrb, E_RUNTIME_ERROR, "can't delete environment variable");
     }
   } else {
-    mrb_convert_type(mrb, value, MRB_TT_STRING, "String", "to_str");
+    mrb_convert_type(mrb, value, MRB_TT_STRING, MRB_SYM(to_str));
     cvalue = mrb_string_value_cstr(mrb, &value);
     if (setenv(cname, cvalue, 1) != 0) {
       mrb_raise(mrb, E_RUNTIME_ERROR, "can't change environment variable");

これでOKっぽい。ただ、先ほど説明した通り version.h が更新されていないので、分岐して吸収するということができないので、先に更新してくれた方が嬉しいなあ。

いったんはmod_mrubyで使うbuild_config.rbを

conf.gem :github => 'udzura/mruby-env'

こうします

( cd mruby; rake deep_clean )
sh build.sh
/home/vagrant/mod_mruby/mruby/build/repos/host/mruby-process/src/process.c:263:14: error: too many arguments to function ‘mrb_convert_type’
     status = mrb_convert_type(mrb, status, MRB_TT_FIXNUM, "Integer", "to_int");
              ^~~~~~~~~~~~~~~~
In file included from /home/vagrant/mod_mruby/mruby/build/repos/host/mruby-process/src/process.c:5:0:
/home/vagrant/mod_mruby/mruby/include/mruby.h:1253:19: note: declared here
 MRB_API mrb_value mrb_convert_type(mrb_state *mrb, mrb_value val, enum mrb_vtype type, mrb_sym method);

う〜っ

なおして再ビルドすると、通るのだが、起動しない。

$ ./mruby/bin/mruby -e 'p :Hi'
wrong constant name path= (NameError)

なんなん... preludeで死ぬ場合mrdbが使えなくて苦しい。

$ gdb --args ./mruby/bin/mruby -e 'p :Hi'
GNU gdb (Ubuntu 8.1-0ubuntu3.2) 8.1.0.20180409-git
Copyright (C) 2018 Free Software Foundation, Inc.
...
(gdb) b longjmp
Breakpoint 1 at 0x2c970
(gdb) r
Starting program: /home/vagrant/mod_mruby/mruby/bin/mruby -e p\ :Hi

Breakpoint 1, __libc_siglongjmp (env=0x7fffffffe040, val=1) at longjmp.c:28
28	longjmp.c: No such file or directory.
(gdb) bt
#0  __libc_siglongjmp (env=0x7fffffffe040, val=1) at longjmp.c:28
#1  0x00007ffff735df49 in longjmp_compat (env=<optimized out>, val=<optimized out>) at pt-longjmp.c:40
#2  0x000055555559d592 in exc_throw (mrb=0x555555949260, exc=93824996398544) at /home/vagrant/mod_mruby/mruby/src/error.c:194
#3  0x000055555559d654 in mrb_exc_raise (mrb=0x555555949260, exc=93824996398544) at /home/vagrant/mod_mruby/mruby/src/error.c:209
#4  0x000055555559e0b8 in raise_va (mrb=0x555555949260, c=0x555555956960, fmt=0x55555566bcf3 "wrong constant name %n", ap=0x7fffffffd7f0, 
    argc=1, argv=0x7fffffffd7e0) at /home/vagrant/mod_mruby/mruby/src/error.c:395
#5  0x000055555559e272 in mrb_name_error (mrb=0x555555949260, id=3324, fmt=0x55555566bcf3 "wrong constant name %n")
    at /home/vagrant/mod_mruby/mruby/src/error.c:416
#6  0x000055555558b551 in check_const_name_sym (mrb=0x555555949260, id=3324) at /home/vagrant/mod_mruby/mruby/src/class.c:2267
#7  0x000055555558b5bc in mrb_mod_const_defined (mrb=0x555555949260, mod=93824996440832) at /home/vagrant/mod_mruby/mruby/src/class.c:2278
#8  0x00005555555accb9 in mrb_vm_exec (mrb=0x555555949260, proc=0x5555559418c0 <gem_mrblib_mruby_digest_proc>, 
    pc=0x55555569b26a <gem_mrblib_mruby_digest_proc_iseq_0+10> "$\001") at /home/vagrant/mod_mruby/mruby/src/vm.c:1469
#9  0x00005555555a930e in mrb_vm_run (mrb=0x555555949260, proc=0x5555559418c0 <gem_mrblib_mruby_digest_proc>, self=93824996440352, 
    stack_keep=0) at /home/vagrant/mod_mruby/mruby/src/vm.c:1001
#10 0x000055555559b323 in mrb_load_proc (mrb=0x555555949260, proc=0x5555559418c0 <gem_mrblib_mruby_digest_proc>)
    at /home/vagrant/mod_mruby/mruby/src/load.c:696
#11 0x00005555555e8d56 in GENERATED_TMP_mrb_mruby_digest_gem_init (mrb=0x555555949260)
    at /home/vagrant/mod_mruby/mruby/build/host/mrbgems/mruby-digest/gem_init.c:199
#12 0x00005555555d6cf9 in mrb_init_mrbgems (mrb=0x555555949260) at /home/vagrant/mod_mruby/mruby/build/host/mrbgems/gem_init.c:209
#13 0x00005555555bbb5e in init_mrbgems (mrb=0x555555949260, opaque=0x0) at /home/vagrant/mod_mruby/mruby/src/state.c:83
#14 0x000055555559ebe0 in mrb_core_init_protect (mrb=0x555555949260, body=0x5555555bbb42 <init_mrbgems>, opaque=0x0)
    at /home/vagrant/mod_mruby/mruby/src/error.c:569
#15 0x00005555555bbbae in mrb_open_allocf (f=0x5555555bbad5 <mrb_default_allocf>, ud=0x0) at /home/vagrant/mod_mruby/mruby/src/state.c:96
#16 0x00005555555bbb38 in mrb_open () at /home/vagrant/mod_mruby/mruby/src/state.c:75
#17 0x00005555555823a8 in main (argc=3, argv=0x7fffffffe518) at /home/vagrant/mod_mruby/mruby/mrbgems/mruby-bin-mruby/tools/mruby/mruby.c:257

mruby-digestのどこかが悪さをしている...?

ように見えるけど、mgemからmruby-digestを外すと別のエラーになる。

$ ./mruby/bin/mruby -e 'p :Hi'
undefined method 'AF_ROUTE' for class String (NameError)

シンボルテーブルがずれているように思われて(check_const_name_sym (mrb=0x555555949260, id=3324) などが引っかかるのだが)、おそらくpresymの仕組みが想定の通り動いていなそう。

というところまで。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment