肉とビールとパンケーキ by @sotarok

少し大人になった「肉とご飯と甘いもの」

dh-make-pecl (dh-make-php) を使って5分でPECLパッケージをオレオレ.debにする

PEAR だったらデプロイするアプリ内に配置すれば良いのだけど、PECLとかこまりますよね。
あと、どうしても、サーバ複数セットアップとかしてたらいちいち pecl コマンド叩くわけにもいかないので、パッケージ管理をしておきたい感じになります。とはいっても、Debian にしても、CentOS にしても、OSのほうで提供してるaptやyumでのパッケージだと、ライブラリのバージョンアップに追いついてなかったりして困りますよね。

ってことで、社内とかで利用するときに .deb とかつくりたい!

でも Debian パッケージってどうやってつくればいいかわからない!

ってまぁ、そういうことなんですけど、Debianには安心の dh-make のヘルパーがいくつかあるので、それの使い方を紹介します。

  • (今回の環境は squeeze 6.0.4)

準備

Debianパッケージ化に必要なやつをインストールしておきます (gccとかは当然入ってるよねってことで書いてないけど、もし入ってない人は build-essentials なども必要ですよ)

$ sudo apt-get install devscripts dh-make dh-make-php

もし入ってなかったら php5-dev も必要です

$ sudo apt-get install php5-dev

パッケージャー名とかを登録しておきます。

export DEBEMAIL="sotarok@crocos.co.jp"
export DEBFULLNAME="Sotaro Karasawa"

あと、とりあえず作業用ディレクトリに移動しておきます。

$ mkdir ~/tmp/apc-deb
$ cd ~/tmp/apc-deb

パッケージ化したいソースを取得し、pecl パッケージをつくる

今回は、apc を例にやります。*1

pecl ですでに配布されているバージョンをパッケージングする場合は、

$ pecl download apc

で、apc-3.1.9.tgz などを取得します。


... が、今回は、SVN からパッケージングします。なぜなら APC が PHP 5.4 に対応してるのはまだ SVN 版だからです。

$ svn co https://svn.php.net/repository/pecl/apc/trunk ./apc-src
$ cd apc-src

このまま peck package したいところですが、開発版だと package.xml の version がアレなので、そこだけ編集します。

--- package.xml (リビジョン 324826)
+++ package.xml (作業コピー)
@@ -72,7 +72,7 @@
   </developer>
   <date>2012-03-15</date>
   <version>
-    <release>3.1.10-dev</release>
+    <release>3.1.9.99</release>
     <api>3.1.0</api>
   </version>
   <stability>

で、package

$ pecl package
...
Package APC-3.1.9.99.tgz done
Tag the released code with `pear svntag package.xml'
(or set the SVN tag APC-3.1.9.99 by hand)

これで、tgz ファイルができあがりました。

いよいよ dh-make-pecl

ちょっとファイルを移します。

$ cd ..
$ mkdir deb
$ mv apc-src/APC-3.1.9.99.tgz ./deb
$ cd deb

--only 5 をつけて dh-make-pecl します

$ dh-make-pecl --only 5 APC-3.1.9.99.tgz

すると、いくつかファイルが生成されます。

$ ls
APC-3.1.9.99.tgz  php-apc-3.1.9.99  php-apc_3.1.9.99.orig.tar.gz

この php-apc-3.1.9.99 ディレクトリが、apc のソースとdebianディレクトリを含む、debian パッケージのひな形になってます。このディレクトリに入り、おもむろに debuild。

$ cd php-apc-3.1.9.99
$ debuild -uc -us
...

dpkg-buildpackage: source changed by Sotaro Karasawa <sotarok@crocos.co.jp>
 dpkg-source --before-build php-apc-3.1.9.99
dpkg-buildpackage: host architecture amd64
dpkg-checkbuilddeps: Unmet build dependencies: xsltproc
dpkg-buildpackage: warning: Build dependencies/conflicts unsatisfied; aborting.
dpkg-buildpackage: warning: (Use -d flag to override.)
debuild: fatal error at line 1325:
dpkg-buildpackage -rfakeroot -D -us -uc failed

ビルド系の依存関係でビルドが失敗した場合は、apt-get でインストール。 "dpkg-checkbuilddeps: Unmet build dependencies:" に書いてあるやつが、足りてないやつです。このように、失敗したときは適当に apt-get でインストールします。

$ sudo apt-get install xsltproc

さて、再挑戦。

$ debuild -uc -us

...

dpkg-deb: `../php5-apc_3.1.9.99-1_amd64.deb' にパッケージ `php5-apc' を構築しています。
 dpkg-genchanges  >../php-apc_3.1.9.99-1_amd64.changes
dpkg-genchanges: including full source code in upload
 dpkg-source --after-build php-apc-3.1.9.99
dpkg-buildpackage: full upload (original source is included)
Now running lintian...
W: php-apc source: ancient-standards-version 3.8.1 (current is 3.9.1)
W: php5-apc: copyright-refers-to-versionless-license-file usr/share/common-licenses/GPL
W: php5-apc: new-package-should-close-itp-bugFinished running lintian.

で、一個上のディレクトリに移動すると

$ ls -la
合計 316
drwxr-xr-x 4 sotarok sotarok   4096 2012-04-05 13:19 .
drwxr-xr-x 4 sotarok sotarok   4096 2012-04-05 13:17 ..
drwxr-xr-x 6 sotarok sotarok   4096 2012-04-05 11:50 .svn
-rw-r--r-- 1 sotarok sotarok 156206 2012-04-05 13:17 APC-3.1.9.99.tgz
drwxr-xr-x 5 sotarok sotarok   4096 2012-04-05 13:19 php-apc-3.1.9.99
-rw-r--r-- 1 sotarok sotarok   5032 2012-04-05 13:19 php-apc_3.1.9.99-1.diff.gz
-rw-r--r-- 1 sotarok sotarok    755 2012-04-05 13:19 php-apc_3.1.9.99-1.dsc
-rw-r--r-- 1 sotarok sotarok  43787 2012-04-05 13:19 php-apc_3.1.9.99-1_amd64.build
-rw-r--r-- 1 sotarok sotarok   1481 2012-04-05 13:19 php-apc_3.1.9.99-1_amd64.changes
lrwxrwxrwx 1 sotarok sotarok     16 2012-04-05 13:19 php-apc_3.1.9.99.orig.tar.gz -> APC-3.1.9.99.tgz
-rw-r--r-- 1 sotarok sotarok  74678 2012-04-05 13:19 php5-apc_3.1.9.99-1_amd64.deb

php5-apc_3.1.9.99-1_amd64.deb ってファイルができてましたね!

インストールしてみる

$ sudo dpkg -i php5-apc_3.1.9.99-1_amd64.deb
未選択パッケージ php5-apc を選択しています。
(データベースを読み込んでいます ... 現在 55932 個のファイルとディレクトリがインストールされています。)
(php5-apc_3.1.9.99-1_amd64.deb から) php5-apc を展開しています...
php5-apc (3.1.9.99-1) を設定しています ...
$ php -m | grep apc
apc

ちなみに、phpinfo上で見るバージョンは、拡張機能のソースから取得されたものなので、3.1.9 とかになってます(debianパッケージのバージョン 3.1.9.99とは連動してないですよってこと)

簡単でしたね!

  • 準備さえできてれば、5分もかからないですね!
  • 必要なら apc.ini を書き換えたものを準備しておけば、一緒にパッケージングすると、インストールするだけで社内向けの apc.ini が入る、などといったパッケージを作れます。

*1:まぁ、ようするにこれがPHP 5.4 に対応してないから、独自でパッケージングしたい!というわけなんですけどね