ブログ  前の記事  次の記事  2008-03-31 

たけまる / cpan2pkg - .deb を賢く自動作成


2008-03-31

_ cpan2pkg - .deb を賢く自動作成 [cpan][debian]

CPAN モジュールを .deb にするスクリプトを作りました.単純に .deb に
まとめるだけでなく,もう少し賢く振る舞ってくれます.

# 同じことをしている人はたくさんいそうだし,ツールも公開されているの
# かもしれませんが,見つからなかったので作ってみました.より良いもの
# をご存じの方がいましたら教えてください.

開発環境のモジュール構成を忠実に再現したいときに使います.次のよう
な状況を想定しています.

- cpan コマンドでモジュールをインストールして開発し,テストしている
- 運用マシンにも同じバージョンでモジュールをインストールしたい
- Perl をよく知らない人でも扱えるように,.deb にしておきたい
- 開発マシンにインストールされているすべてのモジュールではなく,指
  定したモジュールとその依存モジュールのみインストールしたい

つまり,単に .deb を作成するだけではなく,依存モジュールを自動的に
解決します.また,現在のマシンと同じバージョンで .deb を作成してく
れます.

■ 使い方

使い方は簡単です.開発マシンで,.deb にしたいモジュールを標準入力
かファイルで渡します.ファイルで渡すときは,モジュール名を空白か改
行で区切って列挙してください.プロキシがあるときは環境変数
http_proxy を指定します.
% echo DBIx::Class Catalyst::Controller::Atompub | perl cpan2pkg.pl  # 標準入力
% perl cpan2pkg.pl module_list.txt  # ファイル

すべて無事に終了すると,指定したモジュールとその依存モジュールの
.deb が /tmp/cpan2pkg/deb/ に作成されます.

Debian Etch でしかテストしていませんが,.deb を使っているディストリ
ビューションであれば使えると思います.

■ ダウンロードと注意事項

CodeRepos からダウンロードできます.
http://coderepos.org/share/browser/lang/perl/misc/cpan2pkg

人柱上等な人は以下の注意書きを読んだ上で使ってみてください.

- 作業ディレクトリは /tmp/cpan2pkg で決め打ちです./tmp/cpan2pkg/log
  にログらしきものが出力されます.
- dh-make-perl を実行するときに sudo しています.本来,dh-make-perl
  は root 権限不要なのですが,XML::SAX のように /usr 以下に書き込も
  うとするモジュールがあるので,sudo しておくことにしました.このた
  め,sudo を no password で使えるようにしておいたほうがよいです
  (というか,スクリプトを root で実行した方がいいかも).
- ソースのダウンロードやモジュール名の確認のために,search.cpan.org
  にかなりの回数アクセスします.
- 作成される .deb が依存するパッケージは perl のみとしています.こ
  れは,.deb を作れないモジュールが存在しうるためです.
  Cpan2Pkg::DebMaker->make 内のコメントを外せば,依存パッケージを設
  定できるようになります.

個人的には今のバージョンで間にあっているのですが,sudo の有無や.deb
への依存パッケージ設定,出力ディレクトリをコマンドラインオプション
で指定できるようにしたいですね.あと,コアモジュールは .deb にしな
いのですが,CPAN でアップデートされてるときだけ .deb にするとかあ
るといいかも.

いろいろ気づいたら修正してコミットしてみてください m(_ _)m

■ 準備

cpan2pkg.pl を使う前に,以下の準備をしてください.

.deb の作成に dh-make-perl を使っていますので,あらかじめインストー
ルしておいてください.
% sudo apt-get install dh-make-perl

dh-make-perl v0.25 にはバグがあるので,/usr/share/dh-make-perl/ に
あるファイルに次のパッチを当ててください.
diff -bru usr/share/dh-make-perl.orig/rules.MakeMaker.noxs usr/share/dh-make-perl/rules.MakeMaker.noxs
--- usr/share/dh-make-perl.orig/rules.MakeMaker.noxs	2008-03-26 14:02:47.000000000 +0900
+++ usr/share/dh-make-perl/rules.MakeMaker.noxs	2008-03-26 14:04:01.000000000 +0900
@@ -51,7 +51,7 @@
 	# As this is a architecture independent package, we are not
 	# supposed to install stuff to /usr/lib. MakeMaker creates
 	# the dirs, we delete them from the deb:
-	rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5
+	[ ! -d $(TMP)/usr/lib/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/lib/perl5
 
 	touch install-stamp
 
diff -bru usr/share/dh-make-perl.orig/rules.MakeMaker.xs usr/share/dh-make-perl/rules.MakeMaker.xs
--- usr/share/dh-make-perl.orig/rules.MakeMaker.xs	2008-03-26 14:02:53.000000000 +0900
+++ usr/share/dh-make-perl/rules.MakeMaker.xs	2008-03-26 14:03:49.000000000 +0900
@@ -60,7 +60,7 @@
 	# As this is a architecture dependent package, we are not
 	# supposed to install stuff to /usr/share. MakeMaker creates
 	# the dirs, we delete them from the deb:
-	rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/share/perl5
+	[ ! -d $(TMP)/usr/share/perl5 ] || rmdir --ignore-fail-on-non-empty --parents $(TMP)/usr/share/perl5
 
 	touch install-stamp

dh-make-perl のバグについて
Possible MBF: perl 5.10 and the "remove empty /usr/lib/perl5 dir" bug
(Google Cache) Possible MBF: perl 5.10 and the "remove empty /usr/lib/perl5 dir" bug

■ スクリプトの動作概要

スクリプトの動作を簡単に説明しておきます.

- まず,cpan -a (autobundle) で現在インストールされているモジュール
  のバージョン一覧を取得します.
- 次に,search.cpan.org にアクセスして,指定したモジュールの正式名
  称を解決し .tar.gz をダウンロードします.
- tar.gz を解凍して,META.yml から依存モジュールを読み取ります.
  (Module::Depends を使用).なお,コアモジュールは無視します.
- すべての .tar.gz をダウンロードすると,.deb の作成にとりかかります
- dh-make-perl を使って .deb を作成します.ただし,dpkg (あるいは
  apt) を使ってインストールされているモジュールは作成しません
  (dpkg -l の出力から判定).

■ .deb 以外のパッケージ

Cpan2Pkg::DebMaker を真似して Cpan2Pkg::RpmMaker を作れば,.rpm を
作成することもできます.

一言メッセージをこっそり送信できます (非公開)
 今年の西暦→