少し前にmizzyさんに
そういえば、まっさらなサーバを30分で本番投入できるようにする で stanaka さんが「CPANの依存関係を解析してrpm化する手製スクリプトで、CPANモジュールのrpm化が、ほぼ自動化されています」と書いてるんだけど、これって公開してくれないのかなー。
HowToRpmizeCpanModules - mizzy.org - Trac
と突かれたので、githubで公開してみます。
http://github.com/stanaka/cpan-dependency/tree/master
突かれたついでにmizzyさんに軽く動作確認してもらったところ、それなりに動いているようです。また、はてなでは、このスクリプトを利用して、日々それなりの数のCPANモジュールのrpm化を行っていますので、だいたいうまく動くのではないかと思います。
CentOSやFedoraなどの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化ができるようになります。スクリプト一発といいつつ、多少手間がかかるのですが、現実はそんなものです。