minutus 要件整理
やりたいこと
mruby を Rust に埋め込む
つまり Rust が mruby のコードを解釈できるようにする
mruby 自体は crate の中に含んでいてほしいが、カスタマイズする柔軟性がほしい
具体的には、build_config.rb を何らかの形で渡したい
Rust を mruby に埋め込む
つまり mrbgem の実装手段として Rust を使えるようにする
mruby 自体は crate の中に含む必要がない
やる必要があること
bridge.c を bridge.o に変換する
mruby/includes が必要
crate に含むよりはビルド時に取得するほうが望ましい((可能ならば)任意の環境で動かせるようにするため)
bridge.c から Rust の binding を生成する
mruby/includes が必要
crate に含むよりはビルド時に取得するほうが望ましい((可能ならば)任意の環境で動かせるようにするため)
bridge.o および libmruby.a をリンクして Rust のバイナリをビルドする
bridge.o および libmruby.a が必要
bridge.o および Rust のビルド生成物をリンクして mruby をビルドする
bridge.o および Rust のビルド生成物が必要
現状の戦略
✅ プレーンな mruby をRust に埋め込む
crate が bridge.o、binding、libmruby.a をビルド・リンクする
✅ mruby に Rust を埋め込む
crate が bridge.o、binding をビルドし、リンクを行う。ユーザーが書いた Rakefile が libmruby.a のビルドを行い、諸々のリンクを行う。
❌ カスタマイズした mruby を Rust に埋め込む
crate が bridge.o、binding をビルドし、リンクを行う。ユーザーが書いた build.rs が libmruby.a のビルドを行い、リンクを行う。
Linux でやると死ぬ
カスタマイズした mruby を Rust に埋め込めない件
プレーンな mruby の埋め込みは Linux でも成功するので、カスタムビルド特有の何かしらが悪さをしていると思われる
ここで、そもそも Rust のリンカってどうやって動いてるの(というかRustのビルドってどうやって回ってるの)という疑問が発生する
↑これはあんまり関係なかった
これだーーー!!!!!
実は、少なくとも現行の Ubuntu ではリンカ (GNU ld) の挙動が変更されており、以下のように、--no-as-needed というオプションを指定しないといけないことが分かった。