こんにちは。gfx です。みなさん、意識は高まっていますか? 僕は上々です。今回は拙作の Alien::RRDtool というモジュールを紹介いたします。
CloudForecastやGrowthForecastを使いたい!と思ったとき、RRDtoolのPerlバインディングであるRRDs.pmをインストールするのが面倒だったりします。特にperlbrewで入れたperlではRRDtoolsのソースコードをとってきてビルドしなければならないため、RRDtoolはパッケージマネージャを使ってインストールし、CloudForecastはsystem perlで動かすというのが今までのベストプラクティスでした。
Alien::RRDtoolはRRDtoolをCPAN経由でインストールするためのモジュールで、RRDtoolの各種コマンドとPerlバインディングを簡単にインストールすることができるようになりました。
RRDtoolはシステムログなどにグラフに書き出すためのツールで、たとえば以下のギャラリーで紹介されているようなものが作れます。美麗ですね!かっこいいですね!
使い方についてはRRDtoolのサイトやRRDs.pmのドキュメントを参考にしてください。
使用例としてはGrowthForecast::RRDがこなれていると思います。
このディストリビューションはRRDtoolのインストールが目的です。
まず、RRDtoolの依存している以下のCライブラリをyum, rpm, homebrewなどのパッケージマネージャインストールしてください(システムによっては既にいくつかのライブラリがインストール済みかもしれません)。
Alien::RRDtoolについてはこれで終わりです。
さてこのAlienという名前空間はCPANでも特殊な位置づけとなっています。この名前空間はPerlのライブラリのためのものではなく、異なる言語の(主にCの)ライブラリをインストールするためのものなのです。これは、そのライブラリのバインディングという意味ではなく、純粋のそのライブラリをインストールするということです。
たとえばこのAlien::RRDtoolモジュールこれ自体は何の機能もなく、インストールしたRRDtoolのヘッダファイルやCライブラリの情報をいくらか提供しているだけです。RRDtoolをビルドするためのレシピがこのディストリビューションの中心です。同様に、Alien::PNGやAlien::MeCabなどのディストリビューションもそれぞれCのライブラリをインストールするためのものです。
非PerlのライブラリをAlienディストリビューションで管理することのメリットは、Makefile.PLなどで依存関係を管理できるということにあります。上のセクションではAlien::RRDtoolのためにいくつかのCライブラリをインストールする必要がある、と書きましたが、将来的にそれらのビルドレシピがAlien名前空間に置かれるようになれば、Makefile.PLに依存を書けるようになるでしょう。
Alien名前空間はOSのパッケージマネージャとは独立しているため、最新版を使ったりバージョンを固定したりするのが簡単にできるというメリットもあります。またシステムに依存しないため、CPANクライアントを使える環境でなら同様に使えます。CPAN Testersの恩恵を受けられるのも嬉しいですね。
このAlien名前空間のアイデアはMacで使用されるhomebrewというシステムとよく似ています。システムが持っているのはビルドするレシピ(あるいはビルド済みバイナリのURL)とインストール先の情報だけです。Alien名前空間はCPAN生態系におけるhomebrewといえるでしょう。
一方で課題もあります。Alien名前空間はアイデアとしては素晴らしいのですが、フレームワークや仕様の詳細を提供していないのでレシピの実装方法がまちまちですし、インストールしたライブラリのヘッダファイルやリンカフラグへのアクセス方法も統一されていません。うまく発展すればシステムに依存しない汎用パッケージマネージャとして使える可能性のあるアイデアなので、もう少し考えたいと思っています。
さてこのAlienディストリビューションの実装ですが、ExtUtils::MakeMakerやModule::Installといったオーサリングツールではなく、Module::Buildを使うのが一般的となってです。なにしろPerlのライブラリではないものをビルドしてインストールしなければならないので、細かな制御が必要なのです。
Module::Buildを使う際にあたってのポイントはまだあまり把握していませんが、以下のような感じです。
具体例としてはAlien::RRDtoolのコードが参考になるかと思います。
Alien名前空間のために必要なことを抜き出してフレームワークにするといいかもしれませんね。
Module::Buildは今回はじめて使ってみましたが、カスタマイズが簡単でプログラマブルなので、EU::MMやM::Iで頑張るくらいならModule::Buildを使ったほうよさそうです。
Alien::RRDtool というRRDtoolのインストール用ディストリビューションを紹介しました。またAlien名前空間とModule::Buildについても簡単に解説しました。これらについて感心を持っていただければ幸いです。