そういえば一部にRustを使ったgemをリリースした

rubygems.org github.com

Rustでgemを書く時の注意点については前に書きました。 今回はその続き。

前回の記事の内容では 「ローカルにgemファイルのgitリポジトリを取得してビルドする」 ところまでは行けるのですが、その先、つまり 「rubygems.orgにgemをリリースして使ってもらう」 ところは達成できないのです。何故ならただリリースしてもRustコードのコンパイルはされないから。

ではどうするのか。extconf.rbを書くのです。

まずは、gemspecにextconf.rbを認識させます。

  spec.extensions    = %w(ext/altsv/extconf.rb)

ここまでは基本なのですが、ではextconf.rbに何を書けば良いのか。 C拡張であればmkmfを使えば、それを理解していなくてもサクッとできるのですが、今回はRustコンパイラを使ってもらう必要があるので、"extconf.rb"の役割が何かを知っておく必要があります。

これについて、「何をすればいいの」ということについては、当方はドキュメントを見つけられず、雑に動作確認しつつ調べた結果としては以下のような理解で良さそうでした。

  1. 環境にビルドできる環境が整っているかどうか確認し、整っていないようであれば異常終了する
  2. 環境が整っていれば、Makefileを生成する。そのMakefileを使ってmakeした結果動的ロードライブラリができていれば良い

さて、ここで一からcargoのコマンドラインオプションを確かめてMakefileに直書きするのは大変です。できれば、helix_runtimeが提供するrakeタスクを援用したい。 じゃあどうするか、というわけですが、このrakeタスクを援用するRakefileを出力し、Makefileは単にそのラッパーとすることにしました。rakeの存在性については、今時のgemをインストールしようとする環境を前提とすれば別に前提して良いでしょう。 そのextconf.rbが以下です。

Rustを利用するgemを書くならば概ねこの定義でいけると思います。特にプロジェクト固有の何かは書いていないので。

というわけでリリースしてみたのですが、本番環境にcargoが入っていてrubyを使う環境というのは基本的に稀少でしょうから使いどころは大してないのではと思います。 まあ私がRustでgemを書きたかったので、という以上の意味はないかもしれませんが、どなたかの参考になれば。