Ruby を使って milter を書く場合、milter manager の Ruby バインディングを利用するのが手っ取り早い。 しかし、FreeBSD の ports / packages ではこれが無効化されている(というか、milter manager 自体がデフォルトで有効化していない)ため、ソースを取得して自前でビルドしてやる必要がある。
milter-manager の公式配布元は OSDN のようだが(ちなみに公式サイトにはなぜかダウンロードページや配布元へのリンクというものが存在しない)、例によって接続が極めて不安定な状態。なので ports / packages は github から取得するようになっている。この ports の distfile を利用してもいいのだが、ports のほうもすっかり放置プレイのようでビルド対象が大分古い。せっかくなので、最新版(といってもリリースは 2023 年 1 月だが……)の 2.2.7 を取得する。
milter-manager.2.2.7.tar.gz
をダウンロードしたらこれを展開し、configure
を実行する。この時、オプションを付けてやらないと Ruby バインディングがビルド・インストールされない。
./configure --enable-ruby-milter
ports / packages からインストールしてあって、これを上書きしたくない場合は、インストール先を変更してやった方がいいかも。
それが終わったら、gmake
でビルド。丸々インストールしてしまっていい場合はいきなり gmake install
でもいい。
Ruby バインディングだけインストールする場合、一旦全体を make したあと、Ruby バインディングの在処まで潜って gmake install
を実行する。
cd binding/ruby/ gmake install
上記の手順でインストールした gem は、インストール時に使用した Ruby のバージョンに依存した場所に配置される。そのため、Ruby をバージョンアップすると動かなくなってしまう。
pkg upgrade
等でソフトウェアをアップデートする際は、その対象に Ruby が含まれていないか確認し、含まれていた場合はアップデート後に上記手順を再度実行して gem を再インストールしましょうね。うっかりすると、「ある時からメールが一切送受信できなくなってた」とか恐ろしい事態が……
環境によるのか Ruby のバージョンによるのか1)、milter-manager-2.2.7
の Ruby binding をビルドしようとすると binding/ruby/ext/core/
の中で「rbgobject.h
がない!!」と言われて make
が止まってしまう場合がある。このヘッダファイルは FreeBSD の場合 rubygem-glib2
パッケージに含まれていて、実際に /usr/local/lib/ruby/gems/3.3/extensions/amd64-freebsd-13/3.3/glib2-4.2.9/
や /usr/local/lib/ruby/gems/3.3/gems/glib2-4.2.9/lib/
に当該ファイルが存在している。なので、web を検索して引っかかる「rubygem-glib2
を(再)インストールしてみたら?」という情報は、効果を持たない。configure
とは…… (-_-;
milter-manager-2.1.5
の頃は、milter manager の tar ball 自体に glib2 関連ソースが同梱されていた。一方、2.2.5 や 2.2.7 には同梱されていない。……そうこうしているうちにもメールの受信不能状態は続いているので2)、とりあえず急場をしのごうと 2.1.5 の Ruby binding をビルドしようとしたら、そっちは「型キャストが気に入らん!!!」とか言われてビルド不能。しくしくしく T_T
仕方がないので、milter manager のソース自体は最新版を使うことにし、/usr/local/lib/ruby/gems/3.3/gems/glib2-4.2.9/lib/rbgobject.h
の symlink を binding/ruby/ext/core/
に作成。ところが、一男去ってまた次男、「今度はあれが足りない」「次はあれが欲しい」……と、次々に symlink を張る羽目に。
最初は言われるがままにチマチマと 1 つづつ symlink を張っていたんだが、だんだん嫌になってきて、途中で /usr/local/lib/ruby/gems/3.3/gems/glib2-4.2.9/lib/
内の全ファイル(・ディレクトリ)の symlink を一括作成。ようやくビルドが通った。うーん、なんだかなぁ…… (_ _;