CPANモジュールをスクリプト一発で依存解決しつつrpm化する

少し前にmizzyさんに

そういえば、まっさらなサーバを30分で本番投入できるようにする で stanaka さんが「CPANの依存関係を解析してrpm化する手製スクリプトで、CPANモジュールのrpm化が、ほぼ自動化されています」と書いてるんだけど、これって公開してくれないのかなー。

HowToRpmizeCpanModules - mizzy.org - Trac

と突かれたので、githubで公開してみます。

http://github.com/stanaka/cpan-dependency/tree/master

突かれたついでにmizzyさんに軽く動作確認してもらったところ、それなりに動いているようです。また、はてなでは、このスクリプトを利用して、日々それなりの数のCPANモジュールのrpm化を行っていますので、だいたいうまく動くのではないかと思います。

CentOSFedoraなどのRedhat系ディストリを使っているPerl使いの方は、是非、使ってみてください。

使い方

以下のツール・CPANモジュールをインストールしておいてください。

  • git
  • CPANPLUS
  • RPM::Specfile

githubからクローンして、実行します。ここでは、Linux::Smapsをrpm化します。

git clone git://github.com/stanaka/cpan-dependency.git
cd cpan-dependency
bin/cpan-dependency.pl --conf=config/conf.yml Linux::Smaps

依存関係の解決が手抜きアルゴリズムですので、けっこう時間がかかりますので、ご注意下さい。minicpanあたりでCPANのローカルミラーを作っておいたがほうがいいと思います。

また、アーカイブがtar.gz前提だったりしますので、tar.bz2やzipで圧縮されたアーカイブのCPANモジュールは正しくrpm化できません。その時は中間生成物のspecファイルを直接触ってください。このあたりは気が向いたら、直します。

できたrpmファイルは、適当なディレクトリに集積させて、createrepoでyumリポジトリにすると、yumコマンド一発でインストールできるようになって、より良いと思います。createrepoは「createrepo」を検索 - はてなブックマークあたりを参考にしてください。

設定ファイル

CPANモジュールはMETA.ymlで依存関係を記述するようになっているのですが、常に必要十分なものが書かれているとは限りません。なので、後付けて設定ファイルによって依存関係を補正します。バッドノウハウの塊のようなものですね。

設定ファイルは、以下のようなYAMLフォーマットとなっています。

Log-Log4perl:
  requires:
    Log::Dispatch::File: 1
    Log::Dispatch::FileRotate: 1
    Log::Dispatch::Syslog: 1
    Log::Dispatch::Screen: 1
    IPC::Shareable: 1
  filter_requires:
    RRDs: 1
Test-HTTP:
  build_requires:
    Class::Field: 1
mod_perl:
  build_skip: 1

これは、

  • Log::Log4perlが、Log::Dispatch::Fileに実は依存しており、RRDsには実は依存していない
  • Test::HTTPは、ビルド時にClass::Fieldに実は依存している
  • mod_perlは、既にパッケージがあるなどの理由で、rpm化が不要

ということを意味しています。

このあたりをガリガリ書いていくことで、スムーズにrpm化ができるようになります。スクリプト一発といいつつ、多少手間がかかるのですが、現実はそんなものです。

追記

そういえば、もともとGentooユーザなので、Gentooに用意されているg-cpan.plという素晴らしいスクリプトのrpm版が欲しかった、というのがモチベーションになっています。